本文主要是介绍浏览器保存下载不带后缀的图片文件名命名规则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
最近搞爬虫的时候对于下载图片的时候如何命名碰到的问题。对于一般地址规则的图片,
例如:
https://pic2.zhimg.com/80/v2-2e4868da9f91f3320f3fdad248c28ff8_720w.jpg?source=1940ef5c,
https://wx3.sinaimg.cn/mw690/005uuxWfly1gn6r1cxl15j30xc0ipjz0.jpg
之前都是这么:
filename = url.split('/')[-1].split('?')[0]
或者这么搞的。
from urllib.parse import urlparse
file_name = os.path.basename(urlparse(url).path)
不过最近碰到好多不地址规则的图片,就处理不了。如下:
https://y3p.org/download/file.php?id=235
https://www.sammyboy.com/attachments/1589520290213-png.78635/
但是浏览器保存的时候名字却正常,因为response headers 里面都带了content-disposition字段,包含了文件名信息
https://y3p.org/download/file.php?id=235 字段
content-disposition:inline; filename*=UTF-8''79C2EAD8-AE48-4E39-A65A-5820697B189A.jpeg
https://www.sammyboy.com/attachments/1589520290213-png.78635/ 字段
content-disposition: inline; filename="1589520290213.png"
所以浏览器保存的时候文件名就是79C2EAD8-AE48-4E39-A65A-5820697B189A.jpeg和1589520290213.png
至于不带content-disposition字段url,例如:https://bkimg.cdn.bcebos.com/pic/0eb30f2442a7d933c8956906b500c61373f08202ab39
浏览器应该根据content-type字段和url路径的最后部分组成名字的。
通过fiddler抓包修改response headers,
https://y3p.org/download/file.php?id=235 去掉content-disposition字段,文件名为:file.jpg
https://www.sammyboy.com/attachments/1589520290213-png.78635/ 去掉content-disposition字段,文件名为:下载.png,看样浏览器蒙了。。。
还有浏览器无法正确保存文件名的例子:
https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2021%2F0130%2F1901f6fcj00qnqthz0008d200dv0066g00g20075.jpg&thumbnail=650x2147483647&quality=80&type=jpg
https://www.91porn.com/captcha.php
至于浏览器到底怎么命名下载文件的,搜了一下也没找到太多有用的资料。
实测来看应该是:
1、看content-disposition字段,ps:content-disposition字段值得格式也不一样,上面我我举的例子就是不同的。
2、没有content-disposition字段的话在根据url和Content-Type拼接文件名,
3、最后实在无法处理的默认文件名为:下载,在由Content-Type决定后缀
这篇关于浏览器保存下载不带后缀的图片文件名命名规则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!