I want to be able to stream a file that's uploaded via an upload
field. So far, I haven't really found a way to do this, beyond
grabbing the file name out of filedata, and then sticking static
directory path on the front, which is both kludgy, and I have to think
the wrong way of going about it. Here's what I've got:

def play():
    response.headers["Content-Type"] = "audio/x-vox"
    response.headers["Content-Disposition"] = "attachment; filename="
+ request.args[0] + '.vox'
    rows = db(db.audio_files.playname ==
request.args[0]).select(db.audio_files.ALL)
    if len(rows):
        return open("/opt/web2py/applications/myapp/uploads/" +
rows[0].filedata).read()
    else:
        raise ValueError, "Passed incorrect playname: " +
str(request.args[0])


Essentially, I have another controller uploading to the DB under
audio_files, and sticking a "playname" in the database as a reference
to that file. I can then pass the "playfile" name into this function
in order to get it to return the data out of that file handed back.

Here's the problem. Right now, I've got the directory path prepended
statically. That's bad in a big way. Second, there's no sanitation,
and minimal error handling. That will be cleaned up once I get it
working with an actual solution, rather than this hackish thing.

Basically, I expect that there's something other than
response.download that will give me the actual data for a file. I
tried response.download, but it doesn't let me set the content-type,
or content-disposition (that's all set by it, overriding my header
info). There has to be something that says "take the data from this
database entry, as a file object", I'm just looking for what that is.

I then want to be able to store back into it, but that's another point
not covered above, and I would assume I can just overwrite the old
file data, or just update the field in the DB. Perhaps if someone is
tackling the previous question, they can give this one a go too?


-- 
Subscription settings: http://groups.google.com/group/web2py/subscribe?hl=en

Reply via email to