在 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 文档的相关部分。