Java 如何使用spring boot压缩下载的文件

Java 如何使用spring boot压缩下载的文件,java,rest,spring-boot,zip,Java,Rest,Spring Boot,Zip,我是java初学者,希望得到一些帮助,使用RESTAPI调用将下载的文件压缩到MSSQL后端。下面是代码片段,它将ID作为输入参数,获取该ID的特定记录并在本地下载。 我现在需要修改代码,以便在下载文件时对其进行压缩 @GetMapping("/message/save") @CrossOrigin(origins = "*") public ResponseEntity<byte[]> download(@RequestParam("id") Long id) th

我是java初学者,希望得到一些帮助,使用RESTAPI调用将下载的文件压缩到MSSQL后端。下面是代码片段,它将ID作为输入参数,获取该ID的特定记录并在本地下载。 我现在需要修改代码,以便在下载文件时对其进行压缩

@GetMapping("/message/save")
    @CrossOrigin(origins = "*")
    public ResponseEntity<byte[]> download(@RequestParam("id") Long id) throws Exception {
        Optional<MessageEntity> messageRecord = messageRepository.findById(id);
        MessageEntity messageEntity = messageRecord.get();
        ObjectMapper objectMapper = new ObjectMapper();
        String xml = objectMapper.writeValueAsString(messageEntity);
        byte[] isr = xml.getBytes();
        String fileName = "message.zip";
        HttpHeaders respHeaders = new HttpHeaders();
        respHeaders.setContentLength(isr.length);
        respHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        respHeaders.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileName);
        return new ResponseEntity<byte[]>(isr, respHeaders, HttpStatus.OK);
    }
@GetMapping(“/message/save”)
@交叉原点(原点=“*”)
公共响应性下载(@RequestParam(“id”)Long id)引发异常{
可选messageRecord=messageRepository.findById(id);
MessageEntity MessageEntity=messageRecord.get();
ObjectMapper ObjectMapper=新的ObjectMapper();
字符串xml=objectMapper.writeValueAsString(messageEntity);
字节[]isr=xml.getBytes();
字符串fileName=“message.zip”;
HttpHeaders respHeaders=新的HttpHeaders();
respHeaders.setContentLength(isr.length);
respHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
respHeaders.set(HttpHeaders.CONTENT_处置,“附件;文件名=“+filename”);
返回新的ResponseEntity(isr、RespHeader、HttpStatus.OK);
}

我希望输出是一个压缩文件。

我不确定我是否清楚地理解了您的问题。但我假设您只需要从字符串生成zip:

@GetMapping("/message/save")
@CrossOrigin(origins = "*")
public void download(@RequestParam("id") Long id, HttpServletRequest request,
                     HttpServletResponse response) throws Exception {
    MessageEntity messageEntity = messageRepository.findById(id).orElseThrow(() -> new Exception("Not found!"));
    String xml = new ObjectMapper().writeValueAsString(messageEntity);
    String fileName = "message.zip";
    String xml_name = "message.xml";
    byte[] data = xml.getBytes();
    byte[] bytes;
    try (ByteOutputStream fout = new ByteOutputStream();
         ZipOutputStream zout = new ZipOutputStream(fout)) {
        zout.setLevel(1);
        ZipEntry ze = new ZipEntry(xml_name);
        ze.setSize(data.length);
        zout.putNextEntry(ze);
        zout.write(data);
        zout.closeEntry();
        bytes = fout.getBytes();
    }
    response.setContentType("application/zip");
    response.setContentLength(bytes.length);
    response.setHeader("Content-Disposition",
            "attachment; "
                    + String.format("filename*=" + StandardCharsets.UTF_8.name() + "''%s", fileName));
    ServletOutputStream outputStream = response.getOutputStream();
    FileCopyUtils.copy(bytes, outputStream);
    outputStream.close();
}

我为我的问题不清楚而道歉。基本上,我需要创建一个GET资源,以便能够获取多个输入参数(多个id例如:100101102等)。我的后端MSSQL服务器具有所需的数据。当使用GET调用我新开发的资源时,数据库应该返回上述ID的数据。这个结果应该被压缩并下载到我的本地下载文件夹中。我应该能够解压的内容没有任何错误。希望这有帮助。我尝试了上面的代码,当使用记事本打开zip文件时,它的内容看起来乱七八糟,无法解压缩。我得到以下消息:意外的数据结束警告:在有效负载数据结束后有一些数据。数据错误:message.xml感谢您在这方面的帮助。谢谢。我对代码做了一些修改(添加了setSize和closeEntry,请检查)非常感谢……我如何将多个ID作为参数传递?目前它采用单个ID作为输入参数。