Axios实现zip文件下载

前端代码片段 - zipDownload.js

import axios from 'axios'
import baseURL from './baseUrl'

const mimeMap = {
  xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  zip: 'application/zip'
}

export function downLoadZip(str, filename) {
  var url = baseURL + str
  axios({
    method: 'get',
    url: url,
    responseType: 'blob',
    headers:{ 'Content-Type': 'application/json; application/octet-stream'}
  }).then(res => {
    resolveBlob(res, mimeMap.zip)
  })
}
/**
 * 解析blob响应内容并下载
 * @param {*} res blob响应内容
 * @param {String} mimeType MIME类型
 */
export function resolveBlob(res, mimeType) {
    console.log(res)
    const blob = new Blob([res.data]);
    const downloadElement = document.createElement("a");
    const href = window.URL.createObjectURL(blob);
    var patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*')
    var contentDisposition = decodeURI(res.headers['content-disposition'])
    var result = patt.exec(contentDisposition)
    var fileName = result[1]
    fileName = fileName.replace(/\"/g, '')
    //后台再header中传文件名
    const name = fileName;
    downloadElement.href = href;
    downloadElement.download = name;
    document.body.appendChild(downloadElement);
    downloadElement.click();
    document.body.removeChild(downloadElement); // 下载完成移除元素
    window.URL.revokeObjectURL(href); // 释放掉blob对象
}

前端使用方式:

import { downLoadZip } from '@/axios/download.js'
...
downLoadZip(apis.GENERTOR_ROAD_MAP_CODE+'/'+this.roadMapItem.mapId, "SoFly-Crane");
...

 Java后端代码:Controller

//实现逻辑部分 - genTableService.generatorCode(){
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ZipOutputStream zip = new ZipOutputStream(outputStream);

        StringWriter sw = new StringWriter();
        
                        // 添加到zip
        zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, craneProjectRoadMap)));
        IOUtils.write(sw.toString(), zip, Constants.UTF8);
        IOUtils.closeQuietly(sw);
        zip.flush();
        zip.closeEntry();
        return outputStream.toByteArray();
}
//请求相应部分
@GetMapping("/genCode/{mapId}")
public void genCode(HttpServletResponse response, @PathVariable("mapId") Long mapId)
    {
        try {
            byte[] data = genTableService.generatorCode(mapId);
            response.reset();
            response.addHeader("Access-Control-Allow-Origin", "*");
            response.addHeader("Access-Control-Expose-Headers", "Content-Disposition");
            response.setHeader("Content-Disposition", "attachment; filename=\"crane.zip\"");
            response.addHeader("Content-Length", "" + data.length);
            response.setContentType("application/octet-stream; charset=UTF-8");
            IOUtils.write(data, response.getOutputStream());
        } catch (Exception e) {
            writeTextJson(JsonUtils.getSimpleMapJson(null));
            e.printStackTrace();
        }

    }

如果下载后打开压缩包,出现文件损坏问题,可以通过前端debug到resolveBlob方法位置,查看responseType是否为blob。

 

这种情况有可能是在前端项目中使用了Mock导致的,将Mock的引用去掉即可。

// if (process.env.NODE_ENV === 'development') require('@/mock') 

 

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IMK7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值