我想用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标头,因此您可能需要添加一些逻辑以获取原始文件扩展名,以防用户输入错误.