适配各种文件,图片下载方法封装

资源大致分为两种情况,

1.后台路径返回的流支持直接下载,类似2腾讯云服务器。

2. 路径访问的流不支持下载,但是可以预览。

常见的图片下载报错,统计如下

1.跨域导致下载失败,

2. 图片被缓存本地,第一次下载成功,二次下载失败,这个chrome 经常遇到

3.文件流格式问题,有时候服务器配置,或者后天提供了下载接口路径流转化格式问题,导致下载失败,或者下载文件乱码问题。

下面的方法就是通过前端的手段解决问题,注意如果遇到第三个问题,不要后台作作处理用正常浏览器可预览的路径即可,pdf 图片可以直接预览,其他格式是直接下载,使用该方法没有问题,

如果使用该方法,还不行,请留言,并附上路径

代码如下

**
 * 根据文件url获取文件名
 * @param url 文件url
 */
function getFileName(url) {
  const num = url.lastIndexOf('/') + 1
  let fileName = url.substring(num)
  // 把参数和文件名分割开
  fileName = decodeURI(fileName.split('?')[0])
  return fileName
}

// 下载
export function exportFile(url) {
  /**
   * URL方式保存文件到本地
   * @param data 文件的blob数据
   * @param name 文件名
   */
  function saveAs(data, name) {
    const urlObject = window.URL || window.webkitURL || window
    const export_blob = new Blob([data])
    const save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a')
    save_link.href = urlObject.createObjectURL(export_blob)
    save_link.download = name
    save_link.click()
  }
  url = url.replace(/\\/g, '/')
  const xhr = new XMLHttpRequest()

  if (url.indexOf('?') == -1) {
    // 又丑又长防止重名
    url = `${url}?timestamptmdtmdtmdtmdtmdtmdtmdtmd=${new Date().getTime()}`;
  } else {
    url = `${url}&timestamptmdtmdtmdtmdtmdtmdtmdtmd=${new Date().getTime()}`;
  }
  xhr.open('GET', url, true)
  xhr.responseType = 'blob'
  xhr.setRequestHeader('Access-Control-Allow-Origin', '*');
  // xhr.setRequestHeader('Authorization', 'Basic a2VybWl0Omtlcm1pdA==');

  xhr.onload = () => {
    if (xhr.status === 200) {
      // 获取文件blob数据并保存
      const fileName = getFileName(url)
      saveAs(xhr.response, fileName)
    }
  }

  xhr.send()
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值