所以我使用Flask来提供一些文件。我最近将该项目从Python 3降级为Python 2.7,因此它可以使用更多扩展,并遇到了我以前没有的问题。我正在尝试使用日文文件名从文件系统提供文件,当我尝试return send_from_directory(new_folder_path, filename, as_attachment=True)
时
我得到UnicodeEncodeError: 'ascii' codec can't encode characters in position 15-20: ordinal not in range(128)
。在quote_header_value = str(value)
(这是一个werkzeug的事情)。
我有模板设置在页面上显示文件名只是在HTML中有{{filename}}它显示得很好,所以我假设它以某种方式从文件系统中读取名称?只有当我尝试send_from_directory以便用户可以下载它时才会抛出此错误。我尝试了一堆.encode('utf-8') and
。decode('utf-8')的组合,其中没有任何组合可行,我对此感到非常沮丧。在Python 3中,所有东西都无缝地工作,因为所有东西都被视为unicode,并且寻找解决这个问题的方法带来的结果似乎我需要一个compsci学位来包围我的头脑。有人有解决方法吗?
谢谢。
答案 0 :(得分:0)
str(value)
替换为unicode(value)
,并在http.py和datastructures.py中将“latin-1”的每个实例替换为“utf-8”。它修复了问题,文件在最新的Firefox和Chrome中都可以正常下载。正如我之前所说,我宁愿不必修改我正在使用的库的源代码,因为在不同的系统上部署/测试时会很痛苦,所以如果有人有更好的解决方案请分享。我见过一些人建议只是将文件名作为URL的一部分,但我不能这样做,因为我需要保持我的URL简单和干净。