flask send_file和unicode filename:在IE中断

时间:2013-02-01 11:07:24

标签: python internet-explorer unicode flask

我写了一个函数,可以动态生成一些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中没有问题)。

似乎必须编辑标题以匹配不同浏览器的解析规则,但我不知道如何在烧瓶中执行此操作。

2 个答案:

答案 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)了解背景信息。