我寫了一個函數,可以隨時生成一些csv文件併發送給用戶進行下載。flask send_file和unicode文件名:在IE中損壞
的代碼如下:
@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中沒有問題)。
它看起來像頭必須進行編輯,以匹配不同瀏覽器的解析規則,但我不知道如何在瓶中做到這一點。
不起作用..仍然得到下載dialougue難以理解的文件名。 – thkang
@thkang:看我的編輯。如果你將CSV編碼爲cp949(爲什麼你不使用UTF-8'?),那麼charset參數應該是x-EBCDIC-KoreanAndKoreanExtended,而不是UTF-8。 –
爲cp949,因爲韓文窗口有點尷尬;據我所知,文件內容存儲在cp949中。我測試了cp949和utf-8,並且只有cp949字符串值是excel可讀的。 :(無論如何,在cp949中對report_name進行編碼並將上面的字符集添加到send_file之後,一切都很完美,謝謝。 – thkang