How to download AEM Assets Programitically ?
Hi everyone,
I am new to AEM Assets and I am just trying to download AEM Asset using AssetDownlaodService. The problem here is that the method for downloadAsset is returning me a empty value to the servlet. I am unable to find out the reason behind this. Any suggestion or idea will be Appreciatable.
Below is the code which i am writing for downloading the asset :
import com.day.cq.dam.api.jobs.AssetDownloadService;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.apache.sling.servlets.annotations.SlingServletPaths;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import javax.jcr.Node;
import javax.jcr.Session;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import java.io.*;
import java.util.HashSet;
import java.util.Set;
@Component(service = Servlet.class)
@SlingServletPaths(value = "/bin/assetdownloader")
public class AssetDownloader extends SlingAllMethodsServlet {
@Reference
AssetDownloadService assetDownloadService;
@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
try {
ResourceResolver resourceResolver = request.getResourceResolver();
Session session = resourceResolver.adaptTo(Session.class);
Resource assetResource = resourceResolver.getResource("/content/dam/we-retail/en/features/cart.png/jcr:content");
Resource assetDataResource = resourceResolver.getResource("/content/dam/we-retail/en/features/cart.png/jcr:content/renditions/original/jcr:content");
Node assetNode = assetDataResource.adaptTo(Node.class);
InputStream inputStream = assetNode.getProperty("jcr:data").getBinary().getStream();
OutputStream outputStream = new ByteArrayOutputStream();
IOUtils.copy(inputStream, outputStream);
Set<Resource> assetSet = new HashSet<>();
assetSet.add(assetResource);
assetSet.add(assetDataResource);
String damAsset = assetDownloadService.assetDownload(assetResource, assetSet, true, false, false, StringUtils.EMPTY, null, "Downloadasset.zip", StringUtils.EMPTY, outputStream);
session.save();
response.setContentType("text/html");
if (StringUtils.equals(damAsset, StringUtils.EMPTY)){
response.getWriter().write("Nothing To Download :(");
} else {
response.getWriter().write("AEM Asset to Download : " + damAsset);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Thanks in advance