以前写了一个美剧下载站的应用,遇到了一个尴尬的问题。 所有的 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>