在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
随着前端技术的发展,越来越多的业务场景中需要前端来处理文件下载。在众多的方法中,通过 download 属性介绍 常规的
<a href="result.png" download>download</a> 如果缺少 目前 可以以看到,大部分主流的浏览器基本都已经支持 动态资源下载 面对一些动态内容下载的业务场景,即图片等资源的地址并不是固定的(例如一些在线绘图工具所生成的图片),只使用 HTML 无法满足需求。为了能够满足不同的 URL 下载,可以通过JS 实现一个动态触发 URL 下载的方法。 function download(href, filename='') { const a = document.createElement('a') a.download = filename a.href = href document.body.appendChild(a) a.click() a.remove() } 需要注意的是,代码中对创建的 上述的方法可以实现同源资源的下载。但在很多场景中,还需要处理跨域资源。遗憾的是, 测试:点击下载,结果只是预览而无法下载图片。 注: Chrome65 之前是支持 文件命名问题
<a href="test.png" download="joker.png">下载</a> 如果下载文件的后缀与源文件保持一致,可以设置缺省文件名: <a href="test.png" download="joker">下载</a> 笔者曾遇到过一个问题,通过 a.setAttribute(download, true) 结果在老版本的 Chrome 浏览器中出现了如下情况。 下载文件名成了 经过分析,出现上述问题主要是因为: 1. 首先本不该将 2. 在 Chrome 的早期版本不仅支持跨域资源的 前后端配合完成文件下载的业务场景,一般是由后端设置响应头中的 在 HTTP 场景中,Content-Disposition 第一个参数或者是 inline(默认值,表示回复中的消息体会以页面的一部分或者整个页面的形式展示),或者是 attachment(意味着消息体应该被下载到本地;大多数浏览器会呈现一个“保存为”的对话框,将 filename 的值预填为下载后的文件名)。 如果在响应头中设置了 如果 HTTP 头中的 Content-Disposition 属性赋予了一个不同于此属性的文件名,HTTP 头属性优先于此属性。 经过测试发现,当 HTTP 头中 在 Chrome 浏览器中,不管 HTTP 头中 总结一下: 未在响应头设置 对于后端已经设定了文件名的情况下,如果仍然想要对文件名进行重置,该如何处理呢? Blob: URL 关于 尽管 HTTP URL 需要位于同一源中,但是可以使用 blob: URL 和 data: URL ,以方便用户下载使用 JavaScript 生成的内容(例如使用在线绘图 Web 应用程序创建的照片)。
Blob(blobParts[, options]) var debug = {hello: "world"}; var blob = new Blob([JSON.stringify(debug, null, 2)], {type : 'application/json'}); 如果需要实现一些简单的文本或 JS 字符串之类的文件下载,可以通过将文本信息转成 blob 二进制流,生成一个 Blob URL,配合 const downloadText = (text, filename = '') { const a = document.createElement('a') a.download = filename const blob = new Blob([text], {type: 'text/plain'}) // text指需要下载的文本或字符串内容 a.href = window.URL.createObjectURL(blob) // 会生成一个类似blob:http://localhost:8080/d3958f5c-0777-0845-9dcf-2cb28783acaf 这样的URL字符串 document.body.appendChild(a) a.click() a.remove() } 这种 Blob URL 与常见的 HTTP URL 有什么区别呢? Blob URL / Object URL是一种伪协议,可以让Blob和File对象用作图像和二进制数据下载链接等URL源。 浏览器在内部通过 因此 Blob URL 并不能指向一个服务器资源 ,你无法在其它页面中打开它。同时由于编码格式有所差别,Blob URL 比起 Data URLs 所占的空间资源更少,性能也更好。 Blob 为 Web 开发提供了一个非常有用的功能:创建 Blob URL。将二进制数据封装为 Blob 对象,然后使用 解决方案 通过 Blob 和 Fetch 可以解决跨域和文件命名的问题:使用 function download(href, filename = '') { const a = document.createElement('a') a.download = filename a.href = href document.body.appendChild(a) a.click() a.remove() } function downloadFile(url, filename='') { fetch(url, { headers: new Headers({ Origin: location.origin, }), mode: 'cors', }) .then(res => res.blob()) .then(blob => { const blobUrl = window.URL.createObjectURL(blob) download(blobUrl, filename) window.URL.revokeObjectURL(blobUrl) }) } 此时再点击下载,可以正常的将跨域图片下载到本地了。 需注意的是跨域资源所在的服务器需要配置 // 允许任何域名访问 header('Access-Control-Allow-Origin: *'); //指定域名访问 header('Access-Control-Allow-Origin: https://h5.ele.me'); 目前这种方法还存在一些不足,例如浏览器会限制 Blob 数据大小不超过500M,在性能方面也会有所不足。 总结 目前前端有很多种下载方法, 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持极客世界。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论