前面我们已讲到,web2py相关的upload字段上传的文件进行了加密命名机制,保证了数据安全,格式为:
“表名+字段名+UUID+BASE编码加密后的源文件名”
下载文件时,web2py会自动解码加密的原始文件名供我们下载,对于已上传了的文件,我们还想更改原始文件名怎么办,假设有下表,人员信息,存一张照片,上传的照片文件名就是人员的name:
db.define_table('person',
Field('name','string',label='姓名',writable=False),
Field('photo','upload',label='影像',
uploadfolder=os.path.join(request.folder,'photo'),uploadseparate=True,autodelete=True))
1、我们发现,叫"阿顺"的照片传错了,应该是“阿乐”,我们要更改一下:
record = db(db.person.name == "阿顺").select().first() new_web2py_name = uploadfile_rename(record.photo,“阿乐”+'.jpg') db(db.person.id == record.id).update(name=“阿乐”,photo=new_web2py_name)
2、uploadfile_rename 函数
我们上面自己编写了一个 uploadfile_rename函数用于web2py的文件加密体系,需要2个参数:原加密的文件名,新的文件名,这里我们使用到了web2py自带的filed类。
def uploadfile_rename(web2py_file_name,new_file_name):
web2py_file_name_split = web2py_file_name.split('.')
field = db[web2py_file_name_split[0]][web2py_file_name_split[1]]
file_path = field.retrieve_file_properties(web2py_file_name)
source_file = open(file_path['path']+'\\'+web2py_file_name, 'rb')
new_web2py_name = field.store(source_file, new_file_name, field.uploadfolder)
source_file.close()
#其实不是文件改名,是用web2py的field类重新生了一个文件,所以老文件直接删除了
os.unlink(file_path['path']+'\\'+web2py_file_name)
return new_web2py_name