Cherrypy文件上传非ASCII文件名乱码问题解决
Posted inpool
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cherrypy文件上传非ASCII文件名乱码问题解决相关的知识,希望对你有一定的参考价值。
Cherrypy 版本: 18.0.1
由于某些特殊原因(可能是与标准兼容的问题),Cherrypy对上传文件的原文件名使用 ISO-8859-1 编码方式解码,导致非 ASCII 的文件名显示为乱码。
解决的方式也很简单,只需要对文件名使用 ISO-8859-1 编码然后在使用 UTF-8 重新解码即可。
以下是一个完整的例子:
1 from os import makedirs 2 from os.path import dirname, join as pathjoin, exists as pathexists 3 from cherrypy import expose, quickstart, request, config 4 5 HERE = dirname(__file__) 6 UPLOAD_FOLDER = pathjoin(HERE, ‘uploads‘) 7 8 9 def repaire_filename(filename): 10 return filename.encode(‘ISO-8859-1‘).decode(‘utf-8‘, ‘replace‘) 11 12 13 def save_uploadfiles(files, folder=UPLOAD_FOLDER): 14 if not pathexists(folder): 15 makedirs(folder) 16 if not isinstance(files, list): 17 files = [files] 18 for upload in files: 19 if not upload.filename: 20 continue 21 basename = repaire_filename(upload.filename) 22 filename = pathjoin(folder, basename) 23 with upload.file as upload_file, open(filename, ‘wb‘) as to_save: 24 while True: 25 buf = upload_file.read(8192) 26 if not buf: 27 break 28 to_save.write(buf) 29 30 31 @expose 32 def index(upload_files=None): 33 if request.method == ‘POST‘: 34 save_uploadfiles(upload_files) 35 return ‘‘‘ 36 <form method="POST" enctype="multipart/form-data"> 37 <div><input name="upload_files" type="file" /></div> 38 <div><input name="upload_files" type="file" /></div> 39 <div><input name="upload_files" type="file" /></div> 40 <input type="submit" /> 41 </form> 42 ‘‘‘ 43 44 45 if __name__ == ‘__main__‘: 46 quickstart(index)
以上是关于Cherrypy文件上传非ASCII文件名乱码问题解决的主要内容,如果未能解决你的问题,请参考以下文章
XML 格式的 fileDataBodyPart 未通过 ApacheHttpClient 上传到 CherryPy
2019-07-13 关于form-data的上传中文文件乱码的解决办法?
从 Lambda 中的 S3 通知事件获取非 ASCII 文件名
编写了一个文件,保存为了ANSI编码,再打开之后只有数字,文字全变成了乱码,怎么办
Django,nginx,gunicorn,supervisor:UnicodeEncodeError - 上传非拉丁命名文件时