Cherrypy 版本: 18.0.1 由於某些特殊原因(可能是與標準相容的問題),Cherrypy對上傳文件的原文件名使用 ISO-8859-1 編碼方式解碼,導致非 ASCII 的文件名顯示為亂碼。 解決的方式也很簡單,只需要對文件名使用 ISO-8859-1 編碼然後在使用 UTF-8 重新解 ...
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)