I am trying to add s3 bucket files into a zip. The files in the s3 bucket are in binary/octet-stream format.
When I run the below method
public static void addFileToZip(ZipOutputStream zip, String fileName, InputStream fileContent) throws IOException { try { zip.putNextEntry(new ZipEntry(fileName)); IOUtils.copy(fileContent, zip); zip.closeEntry(); } catch (IOException ioe) { fileContent.close(); } } }
The IO Exception below is thrown when executing IOUtils.copy method
“exception”: “Premature end of Content-Length delimited message body (expected: 206,034; received: 0)”
Any suggestions on how I can handle this or what am doing wrong? Thank you.
Edit:- @LeeGreiner I am getting the InputStream like this:
public ResponseInputStream<GetObjectResponse> getObject(String key) { try (S3Client s3 = s3Client.getClient()) { return s3.getObject( GetObjectRequest.builder() .bucket(bucketName) .key(key) .build() ); } }
Advertisement
Answer
You can use a ResponseTransformer
to convert the response to an input stream:
s3.getObject(getObjectRequest, ResponseTransformer.toInputStream());
My specific method is as follows (it assumes the s3
connection has already been created):
public static InputStream getObject(String key) throws IOException { GetObjectRequest getObjectRequest = GetObjectRequest.builder() .bucket(bucketName) .key(key) .build(); return s3.getObject(getObjectRequest, ResponseTransformer.toInputStream()); }
The resulting input stream can then be added to your zip file in the usual way.