我写了一个函数,可以动态生成一些csv文件并发送给用户下载。
代码如下:
@app.route('/survey/<survey_id>/report')
def survey_downloadreport(survey_id):
survey, bsonobj = survey_get(survey_id)
resps = response_get_multi(survey_id)
fields = ["_id", "sid", "date", "user_ip"]
fields.extend(survey.formfields)
csvf = StringIO.StringIO()
wr = csv.DictWriter(csvf, fields, encoding = 'cp949')
wr.writerow(dict(zip(fields, fields)))
for resp in resps :
wr.writerow(resp)
csvf.seek(0)
now = datetime.datetime.now()
report_name = survey.name + "(" + \
now.strftime("%Y-%m-%d-%H:%M:%S") +\
")" + ".csv"
report_name = report_name.encode("utf-8")
return send_file(csvf,
as_attachment = True,
attachment_filename = report_name)
如您所见,文件名从unicode转换为字符串,并在utf-8中转换(确切地说,它们是韩文字母。)
问题是,在IE中查看页面时文件名完全被破坏(在chrome中没有问题)。
似乎必须编辑标题以匹配不同浏览器的解析规则,但我不知道如何在烧瓶中执行此操作。
答案 0 :(得分:3)
尝试添加
mimetype = 'text/csv; charset=x-EBCDIC-KoreanAndKoreanExtended'
发送文件。
答案 1 :(得分:2)
使用Content-Disposition: attachment; filename="..."
设置下载文件的名称 - 这是Flask的send_file
所做的 - 对于非ASCII字符不可靠。
在Flask使用的werkzeug.http
库中支持RFC 5987之前,以及在您要定位的所有浏览器中,这都是不可修复的。
与此同时,更可靠的跨浏览器方法是在链接到URI时将UTF-8-URL编码的文件名放在URI的尾部,即:
IRI path: /survey/1/report/안녕.csv
URI path: /survey/1/report/%ec%95%88%eb%85%95.csv
请参阅How to encode UTF8 filename for HTTP headers? (Python, Django)了解背景信息。