オンザフライでいくつかの 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 では問題ありません)。
さまざまなブラウザーの解析ルールに一致するようにヘッダーを編集する必要があるようですが、フラスコでこれを行う方法がわかりません。