在 Web 中,如果希望点击一个链接可以进行下载的操作,有以下两种方案可供参考:
后端的解决方案
后端在返回 Response Header 的时候,可以通过指定 Content-Disposition
的值,来改变浏览器默认对链接的行为,从而达到让浏览器直接下载某一个资源的目的。这里,Content-Disposition
的第一个参数有两种值可写:inline
和 attachment
。其中,inline
是默认的值,表示响应中的消息体会以页面的形式展示,而 attachment
则会将这个行为改成下载到本地。
设置成 attachment
之后,还可以进一步通过配置 filename
来指定下载文件的文件名。例子如下:
Content-Disposition: attachment; filename="example.jpg"
如此设置之后,前端在访问到这个 URL 的时候,浏览器就会以 example.jpg
为文件名下载当前的资源了。
更多相关的介绍可以参考这篇文章。
前端的解决方案
除了后端的解决方案之外,前端也可以通过指定 a
标签中的 download
字段来下载文件。对于使用了 download
字段的 a
标签,点击后的默认行为将会有跳转浏览改成文件下载。download
属性可以跟一个文件名作为值,浏览器会将这个值作为下载文件的文件名来使用。
当然,前端的方案相对来说会有更多的限制,主要是以下几点:
- 文件必须是同域的,对于跨域的资源,
download
并不会直接触发下载功能,行为上会和在新窗口打开资源一致; - 如果后端在
Content-Disposition
指定了不同的文件名,那么会以后端指定的结果为准 - 如果后端
Content-Disposition
设置为inline
,不同的浏览器会有不同的行为:Firefox 会按Content-Disposition
的结果来执行;Chrome 则会按download
字段的设置来执行
更多细节可以参考 MDN 文档的相关部分。