sql - 使用原始文件名上传 web2py

标签 sql factory web2py

我想用 SQL.factory() 上传文件
我只想保留原始文件名
我的代码目前是

form = SQLFORM.factory(
    Field('file_name', requires=IS_NOT_EMPTY()),
    Field('file', 'upload',uploadfolder=upload_folder))
if form.accepts(request.vars, session):  #.process().accepted:
    response.flash = u'File uploaded'
    session.your_name = form.vars.file_name
    session.filename = request.vars.file 
elif form.errors:
    response.flash = 'form has errors'
return dict(form=form)

我猜 session.filename = request.vars.file 是你设置文件名的地方。为什么我得到自动生成的文件名 no_data.smth.23u8o8274823zu4i2.smth

谢谢

最佳答案

一、request.vars.file是 Python cgi.FieldStorage对象,所以 session.filename = request.vars.file应该会导致错误。 request.vars.file.file是实际的文件对象,request.vars.file.filename是上传文件的原始名称。

当您通过上传字段上传文件时,web2py 会自动生成格式为“table_name.field_name.random_id.b16encoded_original_filename.extension”的新名称。这样做是为了防止目录遍历攻击并启用下载机制(需要知道表和字段名称)。对于SQLFORM.factory,没有数据库表名,所以默认为'no_table'的表名。

您显示的代码实际上不应生成像“no_data.smth.23u8o8274823zu4i2.smth”这样的文件名。该文件名暗示您已明确告知 SQLFORM.factory使用'no_data'的表名(通过它的table_name参数)并且上传字段名是'smth'。 (上面的代码会生成一个以“no_table.file”开头的文件名。)

请注意,web2py 会自动获取上传文件的原始名称并将其编码(使用 b16encode)为新文件名(然后在使用内置下载机制时对原始文件名进行解码)。原始文件名也可以在 form.vars.file.filename 中找到。因此,您根本不需要用户输入文件名。但是,如果您想让用户输入可能与实际文件名不同的文件名,然后使用用户输入的文件名,则可以在创建表单之前添加以下内容:

if 'file' in request.vars and request.vars.file_name:
    request.vars.file.filename = request.vars.file_name

这会将上传文件的文件名重新分配给用户输入的值,然后 web2py 会将用户输入的文件名编码为新文件名。但是请注意,web2py 依赖于文件扩展名在下载时适本地设置 HTTP header ,因此您可能需要添加一些逻辑来获取原始文件扩展名,以防用户无法输入它。

关于sql - 使用原始文件名上传 web2py,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8008213/

相关文章:

SQL 连接 6 个表

python - web2py 添加用户名验证

ssl - 如何在Web2py中使用Comodo证书?

python - 从 web2py 返回 JSON 列表

mysql - 尝试在 SQL 中连续显示前几天的记录

MySQL 查询选择 30 天内到期发票的公司

sql - 如何在 phpmyadmin 中插入外键

C++ 和 STL : Constructor Factory

javascript - 一个元素上具有相同类的 jQuery 多个小部件可能吗?

c# - 类型参数必须是逆变有效的