在web2py中返回uploads目录的文件 - 字符串问题

1 投票
2 回答
3023 浏览
提问于 2025-04-16 20:04

我有用户通过一个假的目录结构上传文件,这个结构是用数据库来实现的。我在数据库中有父路径、文件名和文件(文件类型是“上传”)这些字段,这些都是我通过控制器设置的。我可以看到文件确实被正确地存储在上传目录中,所以这一部分是没问题的。为了参考,我是这样存储文件的:

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

我现在想设置一个下载文件的功能,这样用户就可以通过类似 app/controller/function/myfiles/image.jpg 的方式下载文件。我是用以下代码来找到文件的:

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

我尝试返回 file.file,但我得到的 jpg 文件其实是一些像这样的字符串:

allfiles.file.89fe64038f1de7be.6d6f6e6b65792d372e6a7067.jpg

这就是数据库中的文件名。我还尝试了这段代码:

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

但我得到的是这个路径:

/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

我觉得这可能是一种特殊的字符串,或者 file.file 可能并不完全是一个字符串。我能通过我的函数把文件返回给用户吗?

2 个回答

1

Python中的字符串是一种序列类型,所以它们是可以被逐个访问的。当你把一个字符串作为参数传给join方法时,它会一个一个地处理字符串里的每个字符。比如说:

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

另外,注意os.path.join会自动用你操作系统合适的路径分隔符来分隔它的参数(也就是os.path.sep),所以你不需要手动插入斜杠。

4

你说得差不多了。试试这个:

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

撰写回答