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)