Я написал функцию, которая генерирует некоторый файл csv на лету и отправляет пользователю для загрузки.flask send_file и unicode filename: broken in 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)
, как вы можете видеть, имя файла преобразуется из Юникода в строку и в UTF-8 (точнее, они в корейских букв.)
проблема в том, что имена файлов полностью нарушены при просмотре страницы в IE (без проблем в хроме).
Кажется, что заголовок должен быть отредактирован для соответствия правилам синтаксического разбора для разных браузеров, но я не знаю, как это сделать в колбе.
не работает .. все еще получить непонятное имя файла при загрузке dialougue. – thkang
@thkang: см. Мое редактирование. Если вы кодируете CSV как cp949 (почему вы не используете UTF-8??), То параметр charset, вероятно, должен быть x-EBCDIC-KoreanAndKoreanExtended, а не UTF-8. –
для cp949, потому что корейские окна немного неудобны; насколько я знаю, содержимое файла хранится в cp949. Я тестировал cp949 и utf-8, и только строковые значения cp949 были превосходными. :(В любом случае, после кодирования 'report_name' в cp949 и добавления вышеуказанной кодировки в send_file, все идеально. – thkang