JavaScript 通过 js 实现 <a href="remote server url" download />的方法

lukefan · 2021年01月25日 · 最后由 aaline57963 回复于 2021年02月18日 · 296 次阅读

以前写了一个美剧下载站的应用,遇到了一个尴尬的问题。 所有的 torrent 文件,都存放到了七牛云存储的 cdn 上,链接上去之后,每次点击,浏览器会在新窗口中将 torrent 作为文本文件直接打开。 后来发现,有一个 H5 的标记,可以写,浏览器收到这种标签,就知道要用什么文件名来下载文件。 测试了几次,发现没有效果。 再仔细看了看文档,这里面有一个限制,url 必须是本站的地址,不能是站外的地址。于是在网上找了一下,最后发现了一种还算简单地处理方法。 用 fetch 直接将远端的 url 作为 blob 拉过来,然后通过 window.URL.createObjectURL 函数来生成一个临时的本地地址,再下载,然后注销掉临时本地地址。 代码如下,没有用 torrent,用了一张图片,点击直接下载而不是打开:

<button onClick={(e) => {
          const url = "http://5b0988e595225.cdn.sohucs.com/images/20181229/39193e04345340818c0a5a0345f9d107.jpeg"
          fetch(url, {responseType: 'blob'}).then((response) => {
            return response.blob()
          }).then((blob) => {
            let bl = new Blob([blob], {type: "image/jpeg"})
            var a = document.createElement('a')
            a.href = window.URL.createObjectURL(bl)
            a.download = 'a.jpg'
            a.click()
            window.URL.revokeObjectURL(a.href)
          }).catch((e) => {
            console.log("Oops, error")
          })
        }}>download</button>

其实楼主我觉得你代码中截取几行就可以搞定了,不用转换为 blob,还有一个好处是下载大文件是可以看到下载进度不需要等文件全读取到 blob

<button onClick={(e) => {
          const url = "http://5b0988e595225.cdn.sohucs.com/images/20181229/39193e04345340818c0a5a0345f9d107.jpeg"
            var a = document.createElement('a')
            a.href = url;
            a.download = 'a.jpg'
            a.click()
        }}>download</button>

或者直接 <a href="http://5b0988e595225.cdn.sohucs.com/images/20181229/39193e04345340818c0a5a0345f9d107.jpeg" download="a.jpg" />download</a> 哈哈

layerssss 回复

你这种方式,我早就试过了,是不行的。

<a>

里面规定,如果是加入 download 下载属性,则内容必须是在本机的。

如果是在其他域名和服务器上的东西,会失效的。

所以必须拉回到本机上,再生成临时 url,才能通过 download 属性实现下载。

Rei 回复

我是用的七牛云存储做得 cdn 存储。这个值得试试。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号