以zip下载时如何设置文件名?

时间:2019-11-18 17:10:40

标签: java spring spring-boot zip

我有一个rest api,它使我可以将多个IDS传递到资源,以从特定表下载记录并将其压缩。 MSSQL是后端控制消息。

因此,当将ID作为参数传递时,它将调用数据库表以返回消息数据。下面是代码:

@GetMapping("message/{ids}")
public void downloadmessage(@PathVariable Long[] ids, HttpServletResponse response) throws Exception {
    List<MultiplemessageID> multiplemessageID = auditRepository.findbyId(ids);
    String xml = new ObjectMapper().writeValueAsString(MultiplemessageID);
    String fileName = "message.zip";
    String xml_name = "message.xml";
    byte[] data = xml.getBytes();
    byte[] bytes;
    try (ByteOutputStream bout = new ByteOutputStream(); ZipOutputStream zout = new ZipOutputStream(bout)) {
        for (Long id : ids) {
            zout.setLevel(1);
            ZipEntry ze = new ZipEntry(xml_name);
            ze.setSize(data.length);
            ze.setTime(System.currentTimeMillis());
            zout.putNextEntry(ze);
            zout.write(data);
            zout.closeEntry();
        }
        bytes = bout.getBytes();
    }
    response.setContentType("application/zip");
    response.setContentLength(bytes.length);
    response.setHeader("Content-Disposition", "attachment; " + String.format("filename=" + fileName));
    ServletOutputStream outputStream = response.getOutputStream();
    FileCopyUtils.copy(bytes, outputStream);
    outputStream.close();
}

数据库上的消息具有以下结构:

MSG_ID      C_ID            NAME            INSERT_TIMESTAMP        MSG                                 CONF                                                                                                                                            F_NAME      POS     ID      INB         HEADERS
0011d540    EDW,WSO2,AS400  invoicetoedw    2019-08-29 23:59:13     <invoice>100923084207</invoice>     [iden1:SMTP, iden2:SAP, service:invoicetoedw, clients:EDW,WSO2,AS400, file.path:/c:/nfs/store/invoicetoedw/output, rqst.message.format:XML,]    p3_pfi_1    Pre     101     MES_P3_IN   [clients:EDW,WSO2,AS400, UniqueName:Domain]

我的文件名应类似于:标头名+ _input parameterId [0]的一部分  即Domain_1

多个参数(1,2,3,4)的文件名将类似于  域_1  域_2  Domain_3  Domain_4 下面的代码从标题中检索文件名的一部分作为字符串。

  private static String serviceNameHeadersToMap(String headers) {
          String sHeaders = headers.replace("[", "");
        sHeaders = sHeaders.replace("]", "");
        String res = Arrays.stream(sHeaders.split(", "))
              .filter(s->s.contains("serviceNameIdentifier"))
              .findFirst()
              .map(name->name.split(":")[1])
              .orElse("Not Present");
        return res;

我需要创建一个带有标题和输入参数的文件名。设置好文件名后,我希望使用正确的文件名下载并压缩单个记录。

压缩文件名为message.zip。解压缩后,它应包含Domain_1.xml,Domain_2.xml,Domain_3.xml,Domain_4.xml等单个文件。

我该如何实现?请指教。我需要一些关于Java有限知识的指导。谢谢。

0 个答案:

没有答案