因此,我试图让浏览器下载一个具有特定名称的文件,该文件存储在数据库中。为了防止文件名冲突,使用GUID将文件保存在磁盘上,当需要实际下载文件时,将为浏览器提供数据库中的文件名。这个名字是用日语写的,当我在页面上显示它时,它会很好地显示出来,所以它被存储在数据库中。当我试图让浏览器以这个名字下载它时:
return send_from_directory(app.config['FILE_FOLDER'], name_on_disk,
as_attachment=True, attachment_filename = filename)烧瓶抛出一个错误:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 15-20:
ordinal not in range(128)错误似乎不是源自我的代码,而是来自Werkzeug的一部分:
/werkzeug/http.py", line 150, in quote_header_value
value = str(value)为什么会发生这种情况?根据他们的文档,烧瓶是"100% Unicode“。
实际上,在重写代码之前,我遇到了这个问题,并通过修改Werkzeug中的许多东西来修复它,但是我真的不想为部署的应用程序这样做,因为这是一种痛苦和糟糕的实践。
Python 2.7.6 (default, Nov 26 2013, 12:52:49)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.文件名=“.zip얼티메이트TVアニメ”キルラキル“オリジナルサウンドトラック” 打印回复(文件名)
'[\xec\x96\xbc\xed\x8b\xb0\xeb\xa9\x94\xec\x9d\xb4\xed\x8a\xb8] [131225] TV\xe3\x82\xa2\xe3\x83\x8b\xe3\x83\xa1\xe3\x80\x8c\xe3\x82\xad\xe3\x83\xab\xe3\x83\xa9\xe3\x82\xad\xe3\x83\xab\xe3\x80\x8d\xe3\x82\xaa\xe3\x83\xaa\xe3\x82\xb8\xe3\x83\x8a\xe3\x83\xab\xe3\x82\xb5\xe3\x82\xa6\xe3\x83\xb3\xe3\x83\x89\xe3\x83\x88\xe3\x83\xa9\xe3\x83\x83\xe3\x82\xaf (FLAC).zip'
>>> 发布于 2014-02-21 11:58:59
在处理非ASCII数据时,应该明确地传递unicode字符串(类型为unicode)。通常,在烧瓶中,字节串被假定具有ascii编码。
发布于 2016-02-29 23:29:52
我也有过类似的问题。我最初的目的是将文件作为附件发送:
return send_file(dl_fd,
mimetype='application/pdf',
as_attachment=True,
attachment_filename=filename)其中dl_fd是我的文件的文件描述符。
unicode文件名没有工作,因为HTTP头不支持它。相反,根据来自这个酒瓶问题和这些RFC 2231的测试用例的信息,我重写了上面的代码来对文件名进行编码:
response = make_response(send_file(dl_fd,
mimetype='application/pdf'
))
response.headers["Content-Disposition"] = \
"attachment; " \
"filename*=UTF-8''{quoted_filename}".format(
quoted_filename=urllib.quote(filename.encode('utf8'))
)
return response基于测试用例,上面的内容并不适用于IE8,而是适用于列出的其他浏览器。(我个人在Mac上测试了Firefox、Safari和Chrome )
发布于 2015-06-20 11:20:22
你应该使用这样的方法:
@route('/attachment/<int:attachment_id>/<filename>', methods=['GET'])
def attachment(attachment_id, filename):
attachment_meta = AttachmentMeta(attachment_id, filename)
if not attachment_meta:
flask.abort(404)
return flask.send_from_directory(
directory=flask.current_app.config['UPLOAD_FOLDER'],
filename=attachment_meta.filepath,
)通过这种方式,url_for('attachment',1,u'Москва 北京 תֵּל־אָבִיב.pdf')将生成:
/attachment/1/%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0%20%E5%8C%97%E4%BA%AC%20%D7%AA%D6%B5%D6%BC%D7%9C%D6%BE%D7%90%D6%B8%D7%91%D6%B4%D7%99%D7%91.pdf浏览器将以正确的unicode名称显示或保存此文件。不要使用as_attachment=True,因为这是行不通的。
https://stackoverflow.com/questions/21818855
复制相似问题