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