Skip to content
Advertisement

Create structured archive with files in java

I want to implement GET api that returns ZIP file.

I defined api using openapi

openapi: 3.0.1
info:
  title: xxx
  description: xxx
  version: 2.0.0
tags:
  - name: xxxx
servers:
  - url: /cc/api/v3
paths:
  /path/{param}:
    get:
      tags:
        - xxxx
      operationId: getMyZip
      responses:
        200:
          description: file with zipped reports
          content:
            application/octet-stream:
              schema:
                type: string
                format: binary
      security: []

As far as I understand my api should return byte[], so my controller looks like below

@Override
  public ResponseEntity<Resource> getMyZip(String param) {
    return ResponseEntity
      .ok()
      .contentType(MediaType.APPLICATION_OCTET_STREAM)
      .body(new ByteArrayResource(myService.getMyZip(param)));
  }

Is it ok to return byte[] or it should be some stream, end user will get the zip?

Implementation.

I have map of objects that I am parsing using Jackson object mapper.

How I could create folder structure and place files with json outputs from object mapper. Zip it and return to the caller.

Example:

myZip.zip
   File1.json
   File2.json
   folder1
   folder2
     File3.json

Advertisement

Answer

Just use ZipOutputStream, and wrap it around a ByteArrayOutputStream:

ByteArrayOutputStream bStream = new ByteArrayOutputStream();
ZipOutputStream zipStream = new ZipOutputStream(bStream);

ZipEntry myEntry = ZipEntry("my/awesome/folder/file.txt");

zipStream.addEntry(myEntry);
zipStream.write(myAwesomeData);
//add and write more entries
zipStream.close();

byte[] result = bStream.toByteArray();
Advertisement