Charles L.
Charles L.

Reputation: 6295

Returning a file in uploads directory with web2py - strings issue

I have users upload files into a fake directory structure using a database. I have fields for the parent path & the filename & the file (file is of type "upload") that I set using my controller. I can see that files are properly being stored in the uploads directory so that is working. Just for reference I store the files using

db.allfiles.insert(filename=filename, \
    parentpath=parentpath, \
    file=db.allfiles.file.store(file.file,filename), \
    datecreated=now,user=me)

I am trying to set up a function for downloading files as well so a user can download files using something like app/controller/function/myfiles/image.jpg. I find the file using this code:

file=db((db.allfiles.parentpath==parentpath)&\
        (db.allfiles.filename==filename)&\
        (db.allfiles.user==me)).select()[0]

an I tried returning file.file but the files I was getting jpg files that were strings like:

allfiles.file.89fe64038f1de7be.6d6f6e6b65792d372e6a7067.jpg

Which is the filename in the database. I tried this code:

os.path.join(request.folder,('uploads/'),'/'.join(file.file))

but I'm getting this path:

/home/charles/web2py/applications/chips/uploads/a/l/l/f/i/l/e/s/./f/i/l/e/./8/9/f/e/6/4/0/3/8/f/1/d/e/7/b/e/./6/d/6/f/6/e/6/b/6/5/7/9/2/d/3/7/2/e/6/a/7/0/6/7/./j/p/g

I think this is special type of string or maybe file.file isn't exactly a string. Is there something I can return the file to the user through my function?

Upvotes: 1

Views: 3041

Answers (2)

Anthony
Anthony

Reputation: 25536

Python strings are sequence types, and therefore iterable. When you submit a single string as an argument to the join method, it iterates over each character in the string. So, for example:

>>> '/'.join('hello')
'h/e/l/l/o'

Also, note that os.path.join will automatically separate its arguments by the appropriate path separator for your OS (i.e., os.path.sep), so no need to insert slashes manually.

Upvotes: 1

Gerrat
Gerrat

Reputation: 29710

You're almost right. Try:

os.path.join(request.folder,'uploads',file.file)

Upvotes: 4

Related Questions