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

前端之家收集整理的这篇文章主要介绍了sql – 使用原始文件名上传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标头,因此您可能需要添加一些逻辑以获取原始文件扩展名,以防用户输入错误.

原文链接:https://www.f2er.com/mssql/77410.html

猜你在找的MsSQL相关文章