A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

场景:之前项目中的一个文件上传后下载的需求,后端是把文件存在文件服务器,然后返回给前端一个文件地址
拿到url后使用a标签下载,但是对于文件是图片,.txt或者 .pdf这些浏览器可以直接打开的文件,没有下载,而是直接在当前页面打开了,原因是因为url不是同源的
MDN中说a标签的download的属性仅适用于同源URLs,但是它又说可以使用blob:URLs和data:URLs的形式。
1. 下面是使用blob:URLs和data:URLs来下载图片的代码
//  data: URLs方式
downloadByData (url) {
  let image = new Image()
  image.setAttribute('crossOrigin', 'anonymous')
  image.src = url
  image.onload = () => {
    let canvas = document.createElement('canvas')
    canvas.width = image.width
    canvas.height = image.height
    let ctx = canvas.getContext('2d')
    ctx.drawImage(image, 0, 0, image.width, image.height)
    let ext = image.src.substring(image.src.lastIndexOf('.')+1).toLowerCase()
    let dataURL = canvas.toDataURL('image/' + ext)
    download(dataURL)
  }
},
//  blob: URLs方式
downloadByBlob (url) {
  let image = new Image()
  image.setAttribute('crossOrigin', 'anonymous')
  image.src = url
  image.onload = () => {
    let canvas = document.createElement('canvas')
    canvas.width = image.width
    canvas.height = image.height
    let ctx = canvas.getContext('2d')
    ctx.drawImage(image, 0, 0, image.width, image.height)
    canvas.toBlob((blob) => {
      let url = URL.createObjectURL(blob)
      download(url)
      // 用完释放URL对象
      URL.revokeObjectURL(url)
    })
  }
},
download (href, name = 'pic') {
  let eleLink = document.createElement('a')
  eleLink.download = name
  eleLink.href = href
  eleLink.click()
  eleLink.remove()
}
data: URLs方式是先创建一个图片,然后用canvas绘制该图片,然后使用canvas.toDataURL获得Data URLs
blob: URLs方式也差不多,使用canvas.toBlob得到blob,然后使用URL.createObjectURL创建URL对象
但是上面的方法对于txt和pdf文件就不行了
2. 从服务器get文件的blob数据
直接通过ajax请求,get到文件的blob数据,然后使用blob:URLs的形式下载
downloadByGetBlob (url) {
  axios.get(url, {responseType: 'blob'}).then(res => {
    let blob = res.data
    let url = URL.createObjectURL(blob)
    download(url)
    // 用完释放URL对象
    URL.revokeObjectURL(url)
  })
}
复制代码这种方式需要注意跨域问题,需要后端服务器支持
3. 另外,也可以通过配置nginx反向代理
location /images {
  proxy_redirect  off;
  proxy_pass  https://www.yourfile.com;
}
作者:浇花君
链接:https://juejin.im/post/5c3c0775e51d45522160f5bc
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

13 个回复

倒序浏览
加油哦
回复 使用道具 举报
太厉害了大家
回复 使用道具 举报
回复 使用道具 举报
我在点赞,你呢?加油!
回复 使用道具 举报
加油加油~
回复 使用道具 举报
一起成长
回复 使用道具 举报
加油
回复 使用道具 举报
够够的棒
回复 使用道具 举报
加油同学,加油黑马!
回复 使用道具 举报
努力!奋斗!
回复 使用道具 举报
加油加油
回复 使用道具 举报
回复 使用道具 举报
加油
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马