在JavaScript中实现批量下载OSS中的文件代码示例

2023-06-01 00:00:00 代码 示例 批量

使用JS去批量下载OSS文件需要的依赖库

jszip 

jszip是一个用于创建、读取和编辑.zip文件的JavaScript库,且API的使用也很简单。

url:

https://stuk.github.io/jszip/

file-saver 

著名开源项目 FileSaver.js,在浏览器实现保存文件

url:

https://github.com/eligrey/FileSaver.js


示例代码:

// 下载图片
// files 文件列表
// filename 保存到本地的文件名
function downloadMaterial(files, filename) {
  // 使用xhr请求获取文件内容
  function getImgBuffer(url) {
    return new Promise((reslove, reject) => {
      let xmlhttp = new XMLHttpRequest()
      xmlhttp.open("GET", url, true)
      xmlhttp.responseType = 'blob'
      xmlhttp.onload = function () {
        if (this.status == 200) {
          reslove(this.response)
        } else {
          reject()
        }
      }
      xmlhttp.send()
    })
  }
  const _zip = new zip()
  let promises = []
  // 请求多个文件,并把文件打包进 zip (这里先把请求存入 promises 数组, 实际并未请求)
  for (let i in files) {
    // 这里解释一下为啥用 Math.random()
    // 因为 oss 跨域策略是当请求 header 存在 origin 参数时才会返回对应 cors header
    // 由于 img 并未发送 origin 参数,所以页面渲染了图片,使用xhr再次请求时会使用缓存的信息,导致浏览器没有获取到允许跨域的 header 导致报错,使用 Math.random() 加了参数就用不到 img 缓存的信息了
    const promise = getImgBuffer(`${files[i]}?_r=${Math.random()}`).then((data) => {
      _zip.file(files[i].name, data, { binary: true })
    })
    promises.push(promise)
  }
  // 使用 Promise all 发送请求
  Promise.all(promises).then(() => {
    // 生成zip文件
    _zip.generateAsync({ type: 'blob' }).then(content => {
      // 使用 file-saver保存文件
      FileSaver.saveAs(content, filename)
    })
  }).catch(e => {
    console.log(e)
  })
}


相关文章