Creating a zip of a particular rendition of assets in aem | Community
Skip to main content
Adobe Champion
February 7, 2023
Solved

Creating a zip of a particular rendition of assets in aem

  • February 7, 2023
  • 2 replies
  • 1315 views

I have a list if inputStream as below which contains the stream of a particular rendition of an asset. assetResourceList is a global list<beanclass> object.

 

private void createZipFile( ) throws IOException {
 List<InputStream> inputStreamList = new ArrayList<InputStream>();
 for(Resource assetResource:assetResourceList)
 {
    final Asset asset = DamUtil.resolveToAsset(assetResource);
    InputStream in = asset.getRendition("cq5dam.thumbnail.48.48.png").getStream();
    inputStreamList.add(in);
 }
}

 

How can i convert this inputstream to a zip of images?

I used the below code for the same, but the zip is getting created with filetype and when i open the zip, it says file format not supported. Can someone help.

 

private void createZipFile() throws IOException {
List<InputStream> inputStreamList = new ArrayList<InputStream>();
for(Resource assetResource:assetResourceList)
{


final Asset asset = DamUtil.resolveToAsset(assetResource);
InputStream in = asset.getRendition(DAM_THUMBNAIL).getStream();
inputStreamList.add(in);
}



try (
ZipOutputStream zos = new ZipOutputStream(
new FileOutputStream("C:\\Project\\TestZip\\assets.zip"));
) {
int count =0;
for(InputStream in:inputStreamList){

ZipEntry ze = new ZipEntry("image"+count++);
zos.putNextEntry(ze);
byte[] tmp = new byte[4*1024];
int size = 0;
while((size = in.read(tmp)) != -1){
zos.write(tmp, 0, size);
}
zos.flush();
in.close();
}
// zos.close();
}

 

 

 

 

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.
Best answer by pn_2007

I was able to fix this with the below code.

 

try (
ZipOutputStream zos = new ZipOutputStream(
new FileOutputStream("C:\\Project\\TestZip\\assets.zip"));
) {
int count =0;
for(InputStream in:inputStreamList){

ByteArrayOutputStream os = new ByteArrayOutputStream();
BufferedImage jImage = ImageIO.read(in);
ImageIO.write(jImage, "png", os);
byte[] tmp = os.toByteArray();

ZipEntry ze = new ZipEntry("image"+ count++ +".png");
zos.putNextEntry(ze);
//byte[] tmp = new byte[4*1024];
//int size = 0;
//while((size = in.read(tmp)) != -1){
zos.write(tmp);
//}
zos.flush();
in.close();
os.close();
}
// zos.close();

2 replies

Nitin_laad
Community Advisor
Community Advisor
February 15, 2023

Hi @p_v_nair , try this out -

// Get the resource resolver from the current request or service ResourceResolver resourceResolver = request.getResourceResolver(); // Get the session from the resource resolver Session session = resourceResolver.adaptTo(Session.class); // Get the asset manager from the session AssetManager assetManager = session.getWorkspace().getVersionManager().getAssetManager(); // Get the resource of the image from the DAM path Resource resource = resourceResolver.getResource("/content/dam/my-image.jpg"); // Adapt the resource to an asset Asset asset = resource.adaptTo(Asset.class); // Get the file name of the asset from the metadata String fileName = asset.getMetadataValue("dc:title"); // Create a temporary file to store the downloaded image File tempFile = File.createTempFile(fileName, ".jpg"); // Copy the asset content to the temporary file Files.copy(asset.getOriginal().getStream(), tempFile.toPath()); // Create a zip file to store the zipped image File zipFile = new File(fileName + ".zip"); // Create a buffered output stream to write to the zip file BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(zipFile)); // Create a zip output stream to write the zip entries ZipOutputStream zos = new ZipOutputStream(bos); // Create a zip entry for the image file ZipEntry zipEntry = new ZipEntry(fileName + ".jpg"); // Put the zip entry to the zip output stream zos.putNextEntry(zipEntry); // Copy the temporary file content to the zip output stream Files.copy(tempFile.toPath(), zos); // Close the zip entry zos.closeEntry(); // Close the zip output stream zos.close(); // Delete the temporary file tempFile.delete();

 

 

pn_2007Accepted solution
Level 3
February 15, 2023

I was able to fix this with the below code.

 

try (
ZipOutputStream zos = new ZipOutputStream(
new FileOutputStream("C:\\Project\\TestZip\\assets.zip"));
) {
int count =0;
for(InputStream in:inputStreamList){

ByteArrayOutputStream os = new ByteArrayOutputStream();
BufferedImage jImage = ImageIO.read(in);
ImageIO.write(jImage, "png", os);
byte[] tmp = os.toByteArray();

ZipEntry ze = new ZipEntry("image"+ count++ +".png");
zos.putNextEntry(ze);
//byte[] tmp = new byte[4*1024];
//int size = 0;
//while((size = in.read(tmp)) != -1){
zos.write(tmp);
//}
zos.flush();
in.close();
os.close();
}
// zos.close();