FLASK求生--解决中文文件下载问题

在开发基于python-flask框架的网站的下载功能时,遇到了个大坑:

    虽然flask中自带了文件下载的相关函数,但这些函数在下载文件名中带有中文的文件(如“测试文件.zip”)时,都会报错,出现404等情况。

   百度上有很多种该问题的解决方案,但经过我测试,很多的解决方案在新版flask(0.12.2)+python3.6的环境中根本不好使。研究了一个早上,终于找到了终极解决方案:

@app.route('/file/download/<filename>', methods=['GET'])
def file_download(filename):
    filename=FILE_PATH+filename
    response = make_response(send_file(filename))
    basename = os.path.basename(filename)
    response.headers["Content-Disposition"] = \
        "attachment;" \
        "filename*=UTF-8''{utf_filename}".format(
            utf_filename=quote(basename.encode('utf-8'))
        )
    return response
复制代码

 

解决该问题的关键点在于对header中Content-Disposition的处理:

      Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。当 Internet Explorer 接收到头时,它会激活文件下载对话框,它的文件名框自动填充了头中指定的文件名。(请注意,这是设计导致的;无法使用此功能将文档保存到用户的计算机上,而不向用户询问保存位置。)

服务端向客户端游览器发送文件时,如果是浏览器支持的文件类型,一般会默认使用浏览器打开,比如txt、jpg等,会直接在浏览器中显示,如果需要提示用户保存,就要利用Content-Disposition进行一下处理。因此我们在header中加入了attachment这一项

 此外,flask在处理Content-Disposition的时候,并没有把文件名编码设置成我们常用的UTF-8格式,因此我们需要自己在Content-Disposition中,把文件名设置成UTF-8格式。最后使用 urllib3 库中的(from urllib.parse import quote)中的quote, 对文件名进行编码。


经过这一系列操作,用户就可以下载服务器上文件名中带有中文的文件,而且保存后就是文件名也是中文的了,不会出现乱码。




转载于:https://juejin.im/post/5add4b106fb9a07ab5087f45

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值