3

I have a rest api which allows me to pass multiple IDS to a resource to download records from specific table and zip it. MSSQL is the backend mastering messages.

So when a ID is passed as param, it calls the database table to return the message data. Below is the code:

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

Message on the database has the following structure:

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]

My file name should be like: part of header name + _input parameterId[0] i.e. Domain_1

File name for multiple paramter (1,2,3,4)will be like Domain_1 Domain_2 Domain_3 Domain_4 Below code retrieves the part of file name as string from the header.

  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;

I need to create a file name with header and input parameter. Once the file name is set, I would like individual records downloaded with correct file name and zipped.

Zip file name is message.zip. When unzipped it should contain individual files like Domain_1.xml, Domain_2.xml, Domain_3.xml, Domain_4.xml etc...

How do I achieve this? Please advise. I need some guidance for the limited knowledge on java I have. Thank you.

Misha Akopov
  • 12,241
  • 27
  • 68
  • 82
pitsa
  • 93
  • 2
  • 7
  • Is something like this is what you're looking for?https://stackoverflow.com/questions/27952949/spring-rest-create-zip-file-and-send-it-to-the-client – codeMan Nov 18 '19 at 17:29
  • @codeMan I am looking something similar but i cant get it to work with my limited knowledge in Java. I need help here. Thank you. – pitsa Nov 19 '19 at 09:45

0 Answers0