- HTML并不简单:Web前端开发精进秘籍
- 张鑫旭
- 579字
- 2024-07-24 13:21:51
2.1.3 实用的download属性
Web网页中有如下一段HTML代码,请问点击“案例图片”字样的链接后会有什么效果?
![](https://epubservercos.yuewen.com/BADDE0/30121580904729906/epubprivate/OEBPS/Images/48048_28_1.jpg?sign=1739000660-UCHYQblIFjU5tM8Q2gBMsqDPtWdGY9Oo-0-7d2f4e462619717cc1e40eac0ea3b433)
没错,会在新窗口打开一个图片并预览。
如果希望点击这个链接的行为不是预览图片,而是下载图片,该如何实现?
有人会想到使用FileSaver.js(业界知名客户端资源下载解决方案),此方法确实可以满足需求,却不是最佳实现方法。
其实,浏览器内置了对应的能力,那就是<a>元素专属的download属性,无须使用JavaScript即可实现图片资源的一键下载。
比如可以这样:
![](https://epubservercos.yuewen.com/BADDE0/30121580904729906/epubprivate/OEBPS/Images/48048_28_2.jpg?sign=1739000660-lp82bvvCkzGxskwYkGN7nHxJhB19iZ89-0-c2b63133682ddb3e1684da84a3d68d94)
如果希望指定下载的图片名称,可以这样:
![](https://epubservercos.yuewen.com/BADDE0/30121580904729906/epubprivate/OEBPS/Images/48048_28_3.jpg?sign=1739000660-vC0QmMSKBM5sSX42wyfNRKn2nrkL7ZCQ-0-101f06820090ef970b4736a8584fc25a)
![](https://epubservercos.yuewen.com/BADDE0/30121580904729906/epubprivate/OEBPS/Images/48048_28_4.jpg?sign=1739000660-SbWaIeelMZB7KKYxMPbxCDk9bNP69VcY-0-56e0dd557cd1fe44993f51f53ddf158f)
可以通过在浏览器中输入地址https://www.htmlapi.cn/2/1-5.html或扫码访问来体验上述效果。
需要注意的是,download属性并不是万能的,如果链接的资源跨域了,则无法触发下载,除非浏览器无法打开这个链接资源,在这种情况下,无论是否设置了download属性,都会触发下载行为。例如:
![](https://epubservercos.yuewen.com/BADDE0/30121580904729906/epubprivate/OEBPS/Images/48048_28_5.jpg?sign=1739000660-CNBNJ5Uf8jPJLgx7G6PTi14AddaGFiH8-0-531b458193a2443f30f45338631cf3e2)
此时,点击“案例图片”字样的链接会直接下载example.zip文件,因为浏览器无法解析MIME Type是application/zip的文件。
于是就有人想利用此特性触发某些跨域文件的下载,例如:
![](https://epubservercos.yuewen.com/BADDE0/30121580904729906/epubprivate/OEBPS/Images/48048_28_6.jpg?sign=1739000660-LWfm69NZP4Im0WOQH3SWTjh4PnPlJMPs-0-b4ec83b7a87fd9947c62894e874ae790)
在现代Web开发中,页面模板资源和静态资源都是分离的,属于不同的域名,也就是虽然资源跨域,但是配置的权限还在自己手中,所以就有人通过服务器配置,让PDF文件的header(头信息)中的Content-Type值是某个浏览器不认识的MIME Type类型的,而触发下载。
虽然也能达到效果,但感觉像在耍小聪明,其实更好的做法是配置Content-Disposition的值为attachment,Content-Type和原始文件保持一致即可。例如,在PHP语言中:
![](https://epubservercos.yuewen.com/BADDE0/30121580904729906/epubprivate/OEBPS/Images/48048_29_1.jpg?sign=1739000660-bvwKrRBQ1hMtPNIlT4Wf9Ue6WoTLUtp5-0-32b29c0c0e8ad2c68fece27e9fba3d5a)
由于相关内容与本书关联不大,因此不做进一步展开。