Cherrypy文件上传非ASCII文件

发布时间:2019-03-14 23:50:17编辑:auto阅读(2330)

    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)

     

关键字