SpringBoot 多文件打包下载
第一种
@RestController @RequestMapping("/download") public class DownloadController { @GetMapping("/files") public ResponseEntity<InputStreamResource> downloadFiles() throws IOException { // 创建临时ZIP文件 Path zipFilePath = Files.createTempFile("files", ".zip"); // 需要打包的文件路径 String[] filePaths = { "D:/sample.xls", "D:/qrcode1.png" }; // 打包文件 try (ZipOutputStream zos = new ZipOutputStream(Files.newOutputStream(zipFilePath))) { for (String filePath : filePaths) { File file = new File(filePath); try (FileInputStream fis = new FileInputStream(file)) { ZipEntry zipEntry = new ZipEntry(file.getName()); zos.putNextEntry(zipEntry); byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) > 0) { zos.write(buffer, 0, len); } zos.closeEntry(); } } } // 返回ZIP文件 InputStreamResource resource = new InputStreamResource(Files.newInputStream(zipFilePath)); HttpHeaders headers = new HttpHeaders(); headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename="+URLEncoder.encode("files.zip","UTF-8")); return ResponseEntity .ok() .headers(headers) .contentType(MediaType.APPLICATION_OCTET_STREAM) .body(resource); } }
第二种与MINIO文件服务器集成,inputStream这里需要改成自己的Api
    @GetMapping("/download/files")
    public ResponseEntity<InputStreamResource> downloadFiles(@RequestParam List<String> fileTokens) throws IOException {
        // 获取文件信息列表
//        List<FileEntity> fileEntities = fileRepository.findByFileTokenIn(fileTokens);
//        LambdaQueryWrapper<SysOss> sysOssLambdaQueryWrapper = Wrappers.lambdaQuery(SysOss.class).in(SysOss::getFileToken, fileTokens);
        GetFileInfoParam getFileInfoParam = new GetFileInfoParam();
        getFileInfoParam.setF8s(fileTokens);
        List<SysOssVO> ossVOList =
                iFileDownloadClient.getFileByToken(getFileInfoParam).getData();
        if (ossVOList.isEmpty()) {
            return null;
        }
        // 创建字节数组输出流用于打包ZIP文件
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        try (ZipOutputStream zos = new ZipOutputStream(byteArrayOutputStream)) {
            for (SysOssVO ossVO : ossVOList) {
//                String bucketName = fileEntity.getBucketName();
//                String objectName = fileEntity.getObjectName();
//                String fileName = fileEntity.getFileName();
                // 从MinIO获取文件输入流
                /*try (var inputStream = minioClient.getObject(
                        GetObjectArgs.builder()
                                .bucket(bucketName)
                                .object(objectName)
                                .build())) {*/
                    try (var inputStream = iFileDownloadClient.getAttachmentStream(ossVO.getFileToken())) {
                    // 将文件写入ZIP文件
                    ZipEntry zipEntry = new ZipEntry(ossVO.getFileName());
                    zos.putNextEntry(zipEntry);
                    byte[] buffer = new byte[1024];
                    int len;
                    while ((len = inputStream.read(buffer)) > 0) {
                        zos.write(buffer, 0, len);
                    }
                    zos.closeEntry();
                }
            }
        }
        // 返回ZIP文件
        InputStreamResource resource = new InputStreamResource(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()));
        HttpHeaders headers = new HttpHeaders();
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename="+URLEncoder.encode("files.zip","UTF-8"));
        return ResponseEntity
                .ok()
                .headers(headers)
                .contentType(MediaType.APPLICATION_OCTET_STREAM)
                .body(resource);
    }
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号