如何使用 Java Spring 引导 zip4j return 加密的 zip 文件

How to return an encrypted zip file using Java Spring boot zip4j

我想生成一个受密码保护的 zip 文件,然后 return 到前端。我正在使用 spring 引导和 zip4j 库。可以在后端服务中生成zip文件,但不能发送到前端。

服务

import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.model.enums.CompressionLevel;
import net.lingala.zip4j.model.enums.EncryptionMethod;

public ZipFile downloadZipFileWithPassword(String password){
    
    String filePath="Sample.csv";
    
    ZipParameters zipParameters = new ZipParameters();
    zipParameters.setEncryptFiles(true);
    zipParameters.setCompressionLevel(CompressionLevel.HIGHER);
    zipParameters.setEncryptionMethod(EncryptionMethod.AES);
    ZipFile zipFile = new ZipFile("Test.zip", password.toCharArray());
    zipFile.addFile(new File(filePath), zipParameters);
    
    return zipFile;
}

控制器

import net.lingala.zip4j.ZipFile;

@GetMapping(value = "/v1/downloadZipFileWithPassword")
ResponseEntity<ZipFile> downloadZipFileWithPassword(@RequestParam("password")String password){
    
        ZipFile zipFile = service.downloadZipFileWithPassword(password);
        return ResponseEntity.ok().contentType(MediaType.parseMediaType("application/zip"))
                .header("Content-Disposition", "attachment; filename=\"Test.zip\"")
                .body(zipFile);
    
} 

在控制器中如何将此 ZipFile (net.lingala.zip4j.ZipFile) 转换为输出流并将其发送给客户端?

下面的代码对我有用。

import net.lingala.zip4j.ZipFile;

@GetMapping(value = "/v1/downloadZipFileWithPassword")
ResponseEntity<StreamingResponseBody> downloadZipFileWithPassword(@RequestParam("password") String password) {

    ZipFile zipFile = service.downloadZipFileWithPassword(password);
    return ResponseEntity.ok().contentType(MediaType.parseMediaType("application/zip"))
        .header("Content-Disposition", "attachment; filename=\"Test.zip\"")
        .body(outputStream -> {

            try (OutputStream os = outputStream; InputStream inputStream = new FileInputStream(zipFile.getFile())) {
                IOUtils.copy(inputStream, os);
            }
        });

}