JAVA完成对多个文件打包下载

本文介绍了如何在Java中处理文件上传,包括构造ZipFileDTO对象,获取文件流,将文件名和流添加到模型,最后使用ZipOutputStream进行文件压缩并响应下载请求的过程。
摘要由CSDN通过智能技术生成

step01:构造文件打包模型

@Data
public class ZipFileDTO {
    /**
     * 每个文件的文件名称
     */
    private List<String> fileNms;
    /**
     * 每个文件的流
     */
    private List<ByteArrayOutputStream> streams;
    /**
     * 定义的压缩文件的名称
     */
    private String zipFileNm;
}

step02:获取文件流

    public static ByteArrayOutputStream convert(MultipartFile file) throws IOException {
        try (InputStream input = file.getInputStream();){
            // 获取文件输入流
            // 创建字节数组输出流
            ByteArrayOutputStream output = new ByteArrayOutputStream();

            byte[] buffer = new byte[4096];
            int bytesRead;

            while ((bytesRead = input.read(buffer)) != -1) {
                output.write(buffer, 0, bytesRead);
            }
            return output;
        } catch (Exception e){
            log.error("文件读取错误:e", e);
        }
        return null;
    }

step03:循环文件,写入文件名与文件流

        List<String> fileNms = new ArrayList<>();
        List<ByteArrayOutputStream> streams = new ArrayList<>();
        //(按实际业务处理,省略)
        for (XXXX xxxx: XXXXs) {
 			 streams.add(xxxx.getByteArrayOutputStream());
             fileNms.add(xxxx.getFileName());
        }
        ZipFileDTO zipFileDTO = new ZipFileDTO();
        zipFileDTO.setZipFileNm(candidate.getChineseName() + "-附件.zip");
        zipFileDTO.setStreams(streams);
        zipFileDTO.setFileNms(fileNms);

step04: 根据文件模型进行压缩并放入response

public static void downloadZipFile(HttpServletResponse response, ZipFileDTO fileDTO) {
        List<String> names = fileDTO.getFileNms();
        List<ByteArrayOutputStream> streams = fileDTO.getStreams();
        // 输出Excel文件
        try (
                OutputStream output = response.getOutputStream();
                ZipOutputStream zipStream = new ZipOutputStream(output)
        ) {
            String filename = URLEncoder.encode(fileDTO.getZipFileNm(), StandardCharsets.UTF_8.toString());
            response.setHeader("Content-Disposition", "attachment;filename=" + filename);
            response.setContentType(MediaType.APPLICATION_OCTET_STREAM.toString());

            // 创建压缩文件,并进行打包
            for (int i = 0; i < names.size(); i++) {
                ZipEntry z = new ZipEntry(names.get(i));
                zipStream.putNextEntry(z);
                streams.get(i).writeTo(zipStream);
            }
            zipStream.flush();
        } catch (Exception e) {
            log.error("downloadZipFile错误:e", e);
        }
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值