flask 返回json_轻松掌握文件下载,详解flask中的send_file

在flask中的文件下载使用

后端实现中,我们经常会让用户访问一个URL时下载一个文件. 在flask中直接使用send_file即可.

最简单的send_file如下

39c9490133c6d0dc391f0b4e8e597541.png

我们看下效果

291ba4e7e50c8f7a35ccbd9b6f2010b6.png

可以看到,直接send_file时flask直接返回了文件内容,效果和我们自己的用open+read读出内容并返回一样,浏览器没有识别成一个文件下载.

要浏览器识别为文件下载的话,需要加上as_attachment=True这个选项

77ef423f064069dcf143b72afeec7dee.png

此时我们再访问,可以看到文件被浏览器下载了. 返回的response header里面多了Content-Disposition: attachment; filename=eng.json

d4180d911757abc91f366aa1c94eefe3.png

再看下载文件名里面有中文的情况

22c68ba031290c410913f2b55156341a.png

也能正常处理. 只是response header里面Content-Disposition变成了

Content-Disposition: attachment; filename=.json; filename*=UTF-8''%E4%B8%AD%E6%96%87.json

指令里面多了filename*

909015f1ee9a92749a4fc2a29a47be2f.png

用来指定下载文件的Content-Disposition

Content-Disposition是用来指定下载文件存放的response header,详细的解释如下

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Disposition

其可以是inline(默认值,所以可以不指定)或者是attachment,attachment表示附件,浏览器看到这个值一般会弹出一个保持文件的确认框,或者像chrome直接下载.

7d907d59af150a96d5d2728ed3eb8e5c.png

这个header可以接收的指令为如下3个. 注意其中filename和filename*的区别. 因为http header只能使用ascii编码,中文肯定是不能直接出现在header里面,此时可以直接在filename里面指定urlencode后的名字,也可以在filename*里面指定,因为filename*优先级比filename高.

cc5e2ff8020817bf7875551f89d6717b.png

flask中send_file对附件的处理

我们再看下flask的send_file里面具体是怎么处理的

如果as_attachment为False(默认值),那么不会加Content-Disposition这个头,内容被直接显示,不是附件下载

如果as_attachment为True.尝试对文件名进行ascii编码,如果能成功,那么只使用filename指令即可,如果不成功,需要再使用filename*指令,并使用url_quote对文件名进行url encode.这就是为什么我们上面的例子中,文件名为英文时,只有filename指令,里面包含中文时,同时有filename和filename*指令.

0706bb3847ae87c0a4ca90e431c318ac.png
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flask ,`send_from_directory` 和 `send_file` 都用于向客户端文件,但有一些区别。 send_from_directory` 函数用于从指定目录发送文件。它提供了方便的方式来发送静态文件,如图像、CSS、JavaScript 等。以下是一个示例代码: ```python from flask import Flask, send_from_directory app = Flask(__name__) @app.route('/images/<path:filename>') def get_image(filename): # 从指定目录发送文件 return send_from_directory('static/images', filename) if __name__ == '__main__': app.run() ``` 在上面的示例,当请求 `/images/filename.jpg` 时,`get_image` 函数会从 `static/images` 目录发送名为 `filename.jpg` 的文件。 `send_file` 函数用于发送任意类型的文件。它可以发送动态生成的文件(如通过 Pandas 导出的 XLSX 文件),或者从任意路径发送文件。以下是一个示例代码: ```python from flask import Flask, send_file import pandas as pd app = Flask(__name__) @app.route('/api/export') def export_data(): # 生成文件或从文件路径获取文件 # ... # 发送文件 return send_file('path/to/file.xlsx', as_attachment=True) if __name__ == '__main__': app.run() ``` 在上面的示例,当请求 `/api/export` 时,`export_data` 函数会发送名为 `file.xlsx` 的文件。 总结来说,`send_from_directory` 适用于发送静态文件,而 `send_file` 则适用于发送各种类型的文件,包括动态生成的文件。根据你的需求选择合适的函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值