使用Flask 下载的文件使用中文文件名

使用Flask 编写建立网站,在下载文件时如果把文件名设置为中文时,在下载时会报错。具体代码如下:

    def get(self,*args,**kw):
        fp=io.BytesIO()
        self.do_get(fp,*args,**kw)
        fp.seek(0)
        return send_file(fp,mimetype=self.mimetype,
            as_attachment=True, attachment_filename=filename)

如果attachment_filename 为英文时,程序运行正常。如为中文时,将直接报错。在网上找解决方案,会发现网上众说纷纭,能解决问题的没有。

后来,无意中发现了确处理下载文件时中文文件名乱码的问题(Content-Disposition),这篇文章彻底解决了这个问题。

其核心方法是应该这样设置 Content-Disposition:

Content-Disposition: attachment; filename="$encoded_fname" filename*=utf-8''$encoded_fname

其中,$encoded_fname指的是将 UTF-8 编码的原始文件名按照 RFC 3986 进行百分号 urlencode 后得到的( PHP 中使用 rawurlencode()
函数)。

根据上述方法,可以把上面函数修改如下:

    from urllib.parse import quote
    def get(self,*args,**kw):
        fp=io.BytesIO()
        self.do_get(fp,*args,**kw)
        fp.seek(0)
        filename=quote(self.filename) # 对文件名进行转码
        rv=send_file(fp,mimetype=self.mimetype,
            as_attachment=True, attachment_filename=filename)
        if filename!=self.filename: # 支持中文名称
            rv.headers['Content-Disposition']+=\
              "; filename*=utf-8''%s"%(filename)
        return rv

经过上面的修改,再运行程序。当文件名为中文的时候就可以正常下载了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容