Как заархивировать загруженный файл с помощью весенней загрузки - PullRequest
0 голосов
/ 29 октября 2019

Я новичок в Java и хотел бы получить некоторую помощь в архивировании загруженного файла с помощью вызова rest api в бэкэнд MSSQL. Ниже приведен фрагмент кода, который принимает идентификатор в качестве входного параметра, выбирает запись, специфичную для этого идентификатора, и загружает ее локально. Теперь мне нужен код, измененный для Zip файла при загрузке.

@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);
    }

Я ожидаю, что на выходе получится заархивированный файл.

1 Ответ

0 голосов
/ 29 октября 2019

Я не уверен, что я ясно понял вашу проблему. Но я предполагаю, что вам нужно просто сделать 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();
}
...