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

我们看下效果

可以看到,直接send_file时flask直接返回了文件内容,效果和我们自己的用open+read读出内容并返回一样,浏览器没有识别成一个文件下载.
要浏览器识别为文件下载的话,需要加上as_attachment=True这个选项

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

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

也能正常处理. 只是response header里面Content-Disposition变成了
Content-Disposition: attachment; filename=.json; filename*=UTF-8''%E4%B8%AD%E6%96%87.json
指令里面多了filename*

用来指定下载文件的Content-Disposition
Content-Disposition是用来指定下载文件存放的response header,详细的解释如下
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Disposition
其可以是inline(默认值,所以可以不指定)或者是attachment,attachment表示附件,浏览器看到这个值一般会弹出一个保持文件的确认框,或者像chrome直接下载.

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

flask中send_file对附件的处理
我们再看下flask的send_file里面具体是怎么处理的
如果as_attachment为False(默认值),那么不会加Content-Disposition这个头,内容被直接显示,不是附件下载
如果as_attachment为True.尝试对文件名进行ascii编码,如果能成功,那么只使用filename指令即可,如果不成功,需要再使用filename*指令,并使用url_quote对文件名进行url encode.这就是为什么我们上面的例子中,文件名为英文时,只有filename指令,里面包含中文时,同时有filename和filename*指令.

Flask 中的文件下载:send_file 实现与细节解析
本文详细介绍了在 Flask 中如何使用 send_file 方法实现在用户访问 URL 时触发文件下载。默认情况下,send_file 会直接返回文件内容,而通过设置 as_attachment=True 和 filename 参数,可以使得浏览器将内容识别为文件下载。当文件名包含中文时,Flask 会自动处理编码问题,确保 Content-Disposition 头部正确设置,以便浏览器能够正确处理。send_file 对于附件处理的内部机制包括对文件名的 ASCII 编码检查,以及在必要时使用 urlencode 进行编码。了解这些细节对于优化 Flask 应用的文件下载功能至关重要。
2403

被折叠的 条评论
为什么被折叠?



