当前位置 : 主页 > 网络编程 > JavaScript >

vue如何使用文件流进行下载(new Blob)

来源:互联网 收集:自由互联 发布时间:2023-02-08
目录 vue使用文件流进行下载(new Blob) 封装方法 vue下载文件流完整前后端代码 vue使用文件流进行下载(new Blob) 封装方法 function getExel(url, params, index) {+  return new Promise(function(resolve, reject
目录
  • vue使用文件流进行下载(new Blob)
    • 封装方法
  • vue下载文件流完整前后端代码

    vue使用文件流进行下载(new Blob)

    封装方法

    function getExel(url, params, index) {+
      return new Promise(function(resolve, reject) {
        let data = {
          method: "GET",
          url:url,
          headers: {
            'token':  gettoken("token")
          },
          responseType: 'arraybuffer'
        }
        resolve(axios(data));
      })
    }

    注意:responseType应设置为:'arraybuffer'

    发送请求($Api已经挂载在了vue对象上,所以可以这么使用)

    this.$Api.getExel("/goodsCheckService/v1/planMaterial/export?idList="+idArray)
              .then(response => {
                  let a = document.createElement('a');
     
                  //ArrayBuffer 转为 Blob
                  let blob = new Blob([response.data], {type: "application/vnd.ms-excel"}); 
                  
                  let objectUrl = URL.createObjectURL(blob);
                  a.setAttribute("href",objectUrl);
                  a.setAttribute("download", '计划单电子表格.xls');
                  a.click();
    });

    vue下载文件流完整前后端代码

    使用Vue时,我们前端如何处理后端返回的文件流

    首先后端返回流,这里我把流的动作拿出来了,我很多地方要用

        /**
         * 下载单个文件
         *
         * @param docId
         */
        @GetMapping("/download/{docId}")
        public void download(@PathVariable("docId") String docId,
                             HttpServletResponse response) {
            outWrite(response, docId);
        }
        
        /**
         * 输出文件流
         * @param response
         * @param docId
         */
        private void outWrite(HttpServletResponse response, String docId) {
            ServletOutputStream out = null;
            try {
                out = response.getOutputStream();
                // 禁止图像缓存。
                response.setHeader("Pragma", "no-cache");
                response.setHeader("Cache-Control", "no-cache");
                response.setDateHeader("Expires", 0);
                byte[] bytes = docService.downloadFileSingle(docId);
                if (bytes != null) {
                    MagicMatch match = Magic.getMagicMatch(bytes);
                    String mimeType = match.getMimeType();
                    response.setContentType(mimeType);
                    response.addHeader("Content-Length", String.valueOf(bytes.length));
                    out.write(bytes);
                }
                out.flush();
            } catch (Exception e) {
                UnitedLogger.error(e);
            } finally {
                IOUtils.closeQuietly(out);
            }
        }

    前端这里我引入了一个组件 js-file-download

    npm install js-file-download --save

    然后在Vue文件中添加进来

    import fileDownload from "js-file-download";
       // 文档操作列对应事件
        async handleCommand(item, data) {
          switch (item.key) {
            case "download":
              var res = await this.download(data);
              return fileDownload(res, data.name);
            ...
            default:
          }
          // 刷新当前层级的列表
          const folder = this.getLastFolderPath();
          this.listClick(folder.folderId, folder.name);
        },
        // 下载
        async download(row) {
          if (this.isFolder(row.type)) {
            return FolderAPI.download(row.id);
          } else {
            return DocAPI.download(row.id);
          }
        },

    docAPI js 注意需要设置responseType

    /**
     * 下载单个文件
     * @param {*} id
     */
    const download = (id) => {
      return request({
        url: _DataAPI.download + id,
        method: "GET",
        responseType: 'blob'
      });
    };

    这样即可成功下载 

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持易盾网络。

    网友评论