开发者

Returning a file in uploads directory with web2py - strings issue

开发者 https://www.devze.com 2023-03-14 19:58 出处:网络
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 controll

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 t开发者_StackOverflowhrough my function?


You're almost right. Try:

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


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消