java把文件下载并压缩成zip之后在页面导出

本文介绍了如何在Vue前端使用JavaScript实现文件下载功能,通过axios调用Java后台API获取文件,以及Java后台如何处理多文件并将其打包成ZIP文件进行下载的过程。
摘要由CSDN通过智能技术生成

vue前端代码

downloadFile(id, name) {
      downloadPdf(sdiId).then(response => {
        // 创建一个新的Blob对象
        const blob = new Blob([response], { type: "application/octet-stream" });
        // 创建一个URL.createObjectURL指向这个Blob对象
        const downloadUrl = window.URL.createObjectURL(blob);
        // 创建一个隐藏的a标签用于触发下载
        const aLink = document.createElement('a');
        aLink.style.display = 'none';
        aLink.href = downloadUrl;
        aLink.download = sdName; // 文件名可以从响应头或者其他途径获取
        // 将a标签添加到DOM中并模拟点击,触发下载
        document.body.appendChild(aLink);
        aLink.click();
        // 下载完成后移除a标签并释放内存
        setTimeout(() => {
          document.body.removeChild(aLink);
          window.URL.revokeObjectURL(downloadUrl);
        }, 0);
      }).catch(error => {
        console.error('下载文件失败:', error);
      });
    },

js方法调用后台

/**
 * 下载文档,responseType一定要设置,否则下载到的文件为空白
 * @param data
 */
export function batchDownload(data) {
  return request({
    url: '自己后端的地址' ,
    method: 'post',
    data: data,
    timeout: 100000,
    responseType: 'blob'
  })
}

java后台代码逻辑

 @Override
    public void batchDowmload(Long[] id, HttpServletResponse response, HttpServletRequest request) {
        List<ZipDto> list = new ArrayList<>();
        for (int i = 0; i < sdiIds.length; i++) {
           //获取集合
                    try {
                    //从minio获取文件,这是自己的方法。根据自己实际情况来
                        Response fileResponse = remoteFileService.downloadMaterialFile(info.getSdName(), info.getSdiUrl());
                        list.add(new ZipDto(info.getSdName(), fileResponse.body().asInputStream()));
                    } catch (Exception e) {
                        e.printStackTrace();
                        throw new RuntimeException(e);
                    }
        );
        String fileName = "batch" + ".zip";
        listStreamToZipStream(list, fileName, response);
    }

    /**
     * 将多个流转成zip文件输出
     * @param listStream 文件流实体类对象
     * @param fileName zip包的名称
     * @param response
     * @return
     */
    public static boolean listStreamToZipStream(List<ZipDto> listStream, String fileName, HttpServletResponse response) {
        boolean flag = false;
        BufferedInputStream bis = null;
        FileOutputStream fos = null;
        ZipOutputStream zos = null;
        OutputStream out = null;
        try {
            out = response.getOutputStream();
            response.reset();
            response.setHeader("Content-Disposition",
                    "attachment;filename=" + new String(fileName.getBytes("GB2312"), "ISO-8859-1"));
            response.setHeader("Access-Control-Allow-Origin","*");
            response.setContentType("application/octet-stream; charset=utf-8");
            response.setCharacterEncoding("UTF-8");
            zos = new ZipOutputStream(out);
            byte[] bufs = new byte[1024 * 10];
            for (ZipDto zipDto : listStream) {
                String streamfilename = zipDto.getName();
                // 创建ZIP实体,并添加进压缩包
                ZipEntry zipEntry = new ZipEntry(streamfilename);
                zos.putNextEntry(zipEntry);
                // 读取待压缩的文件并写进压缩包里
                bis = new BufferedInputStream(zipDto.getInputstream(), 1024 * 10);
                int read = 0;
                while ((read = bis.read(bufs, 0, 1024 * 10)) != -1) {
                    zos.write(bufs, 0, read);
                }
            }
            flag = true;
            zos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        } finally {
            // 关闭流
            try {
                if (null != bis){
                    bis.close();
                }
                if (null != zos){
                    zos.close();
                }
                if (null != out){
                    out.close();
                }
            } catch (IOException e) {
//                e.printStackTrace();
                log.error(e.getMessage());
            }
        }
        return flag;
    }

### 回答1: Java可以使用POI库来进行Word文档的操作,ZipFile类来进行压缩文件的操作。具体步骤如下: 1. 首先,将要导出的数据存储到一个List中。 2. 使用POI库来创建一个新的Word文档,并将List中的每一条数据依次插入到Word文档中,形成一个单独的Word文档。 3. 将每个单独的Word文档保存为.doc或.docx格式的文件。 4. 使用ZipFile类将所有的Word文档压缩成一个.zip文件。 5. 把.zip文件发送给需要的人或存储到指定的位置。 这个过程需要使用到Java的IO操作,例如FileInputStream、FileOutputStream、ZipOutputStream等类来实现,还需要学习Java的POI和ZipFile类的使用方法。总体来说,这个过程需要一定的Java编程基础,但是学起来并不难,只要按照步骤一步一步来,就可以完成这个导出数据的过程。 ### 回答2: Java可以使用Apache POI库来实现将数据导出为Word文档。使用POI库可以创建Word文档、给文档添加表格、样式、图片、超链接等内容,并且可以将文档保存为doc或docx格式。 要实现将每一条数据导出为单独的Word文档,可以使用循环和条件语句来遍历数据,并通过POI库将数据添加到新建的Word文档中,最后保存为单独的文档。要将这些单独的Word文档压缩成一个ZIP文件,可以使用JavaZipOutputStream类,该类可以将多个文件压缩成一个ZIP文件。 具体实现中,首先要引入POI库和ZipOutputStream类所需要的依赖,然后通过循环遍历数据,将每一条数据添加到新建的Word文档中,并保存为单独的Word文件。最后,将这些单独的Word文件通过ZipOutputStream类压缩成一个ZIP文件。实现的代码可以参考以下示例: ``` import java.io.*; import java.util.zip.*; import org.apache.poi.xwpf.usermodel.*; public class WordExport { private final static String FILE_PATH = "data/"; // Word文件保存路径 private final static String ZIP_FILE_NAME = "data.zip"; // 压缩后的ZIP文件名 public static void main(String[] args) throws IOException { // 待导出的数据 String[] data = {"数据1", "数据2", "数据3"}; // 创建ZipOutputStream对象 ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(FILE_PATH + ZIP_FILE_NAME)); // 遍历数据,将每个数据导出为单独的Word文件,并压缩到ZIP文件中 for (int i = 0; i < data.length; i++) { // 新建Word文档 XWPFDocument document = new XWPFDocument(); // 添加数据到文档中 XWPFParagraph paragraph = document.createParagraph(); XWPFRun run = paragraph.createRun(); run.setText(data[i]); // 保存Word文档 FileOutputStream fos = new FileOutputStream(FILE_PATH + "data" + (i + 1) + ".docx"); document.write(fos); fos.close(); // 压缩Word文件到ZIP文件中 FileInputStream fis = new FileInputStream(FILE_PATH + "data" + (i + 1) + ".docx"); zos.putNextEntry(new ZipEntry("data" + (i + 1) + ".docx")); byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) > 0) { zos.write(buffer, 0, len); } zos.closeEntry(); fis.close(); } // 关闭ZipOutputStream流 zos.close(); } } ``` 上述代码中,首先定义了Word文件保存路径和压缩后的ZIP文件名。然后通过遍历待导出的数据,将每个数据添加到新建的Word文档中,并保存为单独的Word文件,在保存Word文件后,将每个Word文件通过ZipOutputStream类压缩到ZIP文件中。遍历结束后,关闭ZipOutputStream流,导出和压缩过程完成。 ### 回答3: Java可以通过Apache POI库来实现将数据导出为Word文档的功能,Apache POI库提供了一些API,可以很方便地创建并编辑Word文档。对于将多个Word文档压缩成一个Zip文件的需求,Java可以使用ZipOutputStream类来实现,ZipOutputStream类能够很方便地对多个文件进行压缩处理。以下是大致的实现步骤: 1. 使用POI库创建并编辑Word文档,将数据写入到文档中。 2. 每次写完一条数据后就将该文档保存到本地,可以使用doc或docx格式,以便后续进行压缩。 3. 将所有生成的Word文档文件名存储到一个List中。 4. 使用ZipOutputStream类创建一个Zip压缩包文件,即ZipOutputStream将数据写入到.zip的文件中。 5. 遍历保存Word文档文件名的List,并逐个将文件压缩到ZipOutputStream中。 6. 关闭ZipOutputStream和每个Word文档的输入流。 代码示例: ```java // 创建一个Zip文件输出流 ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream("output.zip")); // 设置压缩方法 zipOut.setMethod(ZipOutputStream.DEFLATED); // 遍历Word文档文件名的List for (String fileName : fileNames) { // 将Word文档文件读入 FileInputStream fis = new FileInputStream(new File(fileName)); // 将读入的Word文档压缩到ZipOutputStream中 zipOut.putNextEntry(new ZipEntry(new File(fileName).getName())); // 读入数据到缓冲区 byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) != -1) { zipOut.write(buffer, 0, len); } // 关闭输入流 fis.close(); // 关闭该Entry zipOut.closeEntry(); } // 关闭ZipOutputStream zipOut.close(); ``` 这样,所有的Word文档都被压缩成了一个Zip文件,每个Word文档都形成了一个单独的Entry,并可以使用任何Zip文件处理工具进行解压。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值