2

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

似乎必须编辑标题以匹配不同浏览器的解析规则,但我不知道如何在烧瓶中做到这一点。

4

2 回答 2

3

尝试添加

mimetype = 'text/csv; charset=x-EBCDIC-KoreanAndKoreanExtended'

发送文件。

于 2013-02-01T15:54:48.250 回答
2

Content-Disposition: attachment; filename="..."用于设置下载文件的名称——这是 Flask 所做的——send_file对于非 ASCII 字符是不可靠的。

werkzeug.http在Flask 使用的库中以及在您想要定位的所有浏览器中支持 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

请参阅如何为 HTTP 标头编码 UTF8 文件名?(Python,Django)作为背景。

于 2013-02-02T10:35:14.897 回答