下载文件时,浏览器是怎么知道文件名称的?
coolpython
共 1470字,需浏览 3分钟
· 2021-08-17
当你在浏览器里下载一个文件时,浏览器是如何知道你所下载的文件的名称的呢?这或许是你从未考虑过的事情,但浏览器必须知道,否则,它就不知道如何保存文件。
1. Content-Disposition 首部
如果能在在http 响应头中找到一个content-disposition 首部,那么就根据这个首部里的内容来确定所下载文件的名称,通常它的格式是这样的
Content-Disposition: attachment; filename=filename.jpg
attachment表示附件,filename 就是服务端希望你使用的文件名称。
如果在http 响应头中找不到content-disposition, 就会默认用url里的最后一段作为保存文件时的名称。
2. flask 实现文件下载
我编写一个简单点flask web 服务,来验证上面的观点,首先,我不设置Content-Disposition首部
from flask import Flask,send_file
app = Flask(__name__)
@app.route('/download')
def download():
res = send_file('./t.jpg')
res.headers['Content-Type'] = 'application/octet-stream'
return res
app.run(debug=True)
在浏览器里访问 http://127.0.0.1:5000/download, 下载的文件自动被保存为download,文件的原始名称不会作为信息传递给客户端。
如果加上Content-Disposition首部,情况就不一样了
res.headers['Content-Disposition'] = 'attachment; filename=test.jpg'
下载后的文件自动被保存为test.jpg,浏览器通过响应头里的Content-Disposition首部确定了附件的文件名称。
3. flask 下载名称包含中文的文件
最后来看一下中文名称会不会受到影响
res.headers['Content-Disposition'] = 'attachment; filename=中文.jpg'
在浏览器里下载,程序报错了
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 43-44: ordinal not in range(256)
一定是编码问题了,怎么解决呢,将包含中文的字符串进行utf-8编码同时进行url编码,最后以设置成特定的格式
filename = '中文.jpg'
context = "attachment; filename*=UTF-8''{utf_filename}".format(utf_filename=quote(filename.encode('utf-8')))
res.headers['Content-Disposition'] = context
这样,就可以下载成包含中文的文件了。
评论
了解加密货币到加密货币的互换
1、什么是加密货币互换?加密货币到加密货币的互换是指以现行市场汇率将一种加密货币直接兑换为另一种加密货币。与需要法定货币存款和较长流程的传统交易所不同,加密货币到加密货币的互换可以无缝地促进交换。掉期在提高加密货币的流动性和效率方面发挥着重要作用。该功能使用户能够将他们的加密货币与钱包中的其他代币进
区块链头条
0
李彦宏:开源大模型不如闭源,后者会持续领先;周鸿祎:“开源不如闭源” 的言论是胡说八道
架构师大咖
架构师大咖,打造有价值的架构师交流平台。分享架构师干货、教程、课程、资讯。架构师大咖,每日推送。
公众号该公众号已被封禁0、李彦宏:开源大模型不如闭源,后者会持续领先当今
源码共读
0
【第129期】程序员的新宠:三款终端工具,让你告别Xshell!
概述 WindTerm:跨平台的SSH利器 首先介绍的是WindTerm,这是一款使用C语言开发的跨平台SSH客户端。它不仅完全免费,而且没有商业使用的限制。WindTerm支持SSH v2、Telnet、Raw Tcp等协议,而且性能出色,甚至超过了FinalShell和Electerm。功能
前端微服务
0
字节员工:35岁以后被裁员的,后来都走了哪条路?现在2-2,要不要利用最后一年拼命上个岸。
架构师大咖
架构师大咖,打造有价值的架构师交流平台。分享架构师干货、教程、课程、资讯。架构师大咖,每日推送。
公众号该公众号已被封禁在当今竞争激烈的职场环境中,年龄并不总是一个决定性
源码共读
0
上班的时候,有一群摸鱼搭子非常重要...
上班的时候,有一群摸鱼搭子非常重要!一到上班时间,他们就从四面八方涌进群里冒泡...从八卦聊到股市、从职场聊到乌X兰局势,偶尔还会复读、相亲、battle...然后,下午6点钟准时消失不见...所以你要不要加入我们一起摸鱼?我们有北京、上海、深圳、广州、杭州、武汉、成都、南京等8个城市的摸鱼群,还有
产品经理日记
0
周四002 瑞超:同样落寞的境遇——北雪平vs埃尔夫斯堡
上赛季最终排名联赛第9的北雪平本赛季伊始表现不佳,4轮战罢他们仅以1胜1平2负的战绩排在倒数第三,这支历史上曾夺得13次联赛冠军、6次杯赛冠军老牌劲旅,正如英格兰赛场上的一众百年俱乐部,在低谷中不断探索着出路。球队主教练安德烈亚斯·阿尔姆曾是AIK索尔纳及赫根队的主教练,他于今年年初刚刚拿起球队教鞭
产品与体验
0
雷军辟谣了!不是高考状元,卡里也没有冰冷的 40 亿
架构师大咖
架构师大咖,打造有价值的架构师交流平台。分享架构师干货、教程、课程、资讯。架构师大咖,每日推送。
公众号该公众号已被封禁最近很火的雷军简历,听说落魄时卡里只有冰冷的 40
源码共读
0
知乎高问:程序员有必要知道为什么做某个功能吗?
将Python客栈设为“星标⭐”第一时间收到最新资讯前言知乎上有一个提问:程序员有必要知道为什么做某个功能吗?↓↓↓今天,我们就这个话题一起来做个讨论。不知道程序员的你,在接到产品经理提的一个需求后,是习惯马上动手开始撸代码呢?还是会先暂停一下,认真思考一会如下一些问题,比如这个需求产生的背景是什么
Python客栈
0