美文网首页
前端 文件打包下载

前端 文件打包下载

作者: zhao_ran | 来源:发表于2021-10-26 21:06 被阅读0次

    如果需要下载打包后的压缩文件,解决方案有多种,可以在服务端打包后返回下载url,前端通过<a>标签下载,亦或是前端去请求每个文件,打包后再下载,为了减轻服务端压力,这次需要在WEB端实现多文件的打包下载。

    安装依赖

    jszip

    JSZip 是一个用于创建、读取和编辑 .zip 文件的 javascript 库,具有可爱而简单的 API。
    https://stuk.github.io/jszip/

    var zip = new JSZip();
    zip.file("Hello.txt", "Hello World\n");
    var img = zip.folder("images");
    img.file("smile.gif", imgData, {base64: true});
    zip.generateAsync({type:"blob"})
    .then(function(content) {
        // see FileSaver.js
        saveAs(content, "example.zip");
    });
    
    file-saver

    FileSaver.js 是在客户端保存文件的解决方案,非常适合在客户端生成文件的 Web 应用程序
    https://github.com/eligrey/FileSaver.js#readme

    import { saveAs } from 'file-saver';
    
    // Saving text
    var blob = new Blob(["Hello, world!"], {type: "text/plain;charset=utf-8"});
    FileSaver.saveAs(blob, "hello world.txt");
    
    
    // Saving URLs
    FileSaver.saveAs("https://httpbin.org/image", "image.jpg");
    

    代码实现

    template
    <el-button class="button success" @click="downloadPhoto">批量下载</el-button>
    
    script
    <script>
    import JSZip from 'jszip'
    import axios from 'axios'
    import { saveAs } from 'file-saver'
    
    
    export default {
      name: 'Download',
      data() {
        return {
          fileList:[
            'https://xxx/xxx/xxx.jpg',
            'https://xxx/xxx/xxx.jpg',
            'https://xxx/xxx/xxx.mp4',
          ]
        }
      },
      methods: {
        // 批量下载
        downloadPhoto() {
          // 获取文件流
          const getFile = (url) => {
            return new Promise((resolve, reject) => {
              axios
                .get(url, {
                  responseType: 'arraybuffer',
                })
                .then((res) => {
                  resolve(res.data)
                })
                .catch((err) => {
                  reject(err.toString())
                })
            })
          }
          // 创建JSZip实例
          const zip = new JSZip()
          // promise对象
          const promises = []
          // 创建下载列表
          const downList = this.fileList
          // 生成每个文件
          downList.forEach((v) => {
            // 获取文件名
            const fileName = v.split('/').slice(-1)
            // 生成promise
            const promise = getFile(v).then((res) => {
              zip.file(fileName, res)
            })
            promises.push(promise)
          })
          // 异步处理
          Promise.all(promises).then(() => {
            // 生成二进制流
            zip
              .generateAsync({
                type: 'blob',
              })
              .then((content) => {
                saveAs(content, this.order.task.title)
              })
          })
        },
      }
    }
    
    
    </script>
    
    

    相关文章

      网友评论

          本文标题:前端 文件打包下载

          本文链接:https://www.haomeiwen.com/subject/jliyaltx.html