Asset download from Adobe DAM via third party portal. | Adobe Higher Education
Skip to main content
Level 4
November 29, 2023
Resuelto

Asset download from Adobe DAM via third party portal.

  • November 29, 2023
  • 4 respuestas
  • 1714 visualizaciones

Hi All,

 

We have requirement where third party portal want to download assets from Adobe DAM. We have exposed API/Servlet for them listed below . This is working fine if asset size is small in size and getting downloaded but for large asset it's throwing 500 server error on third party portal . Can someone suggest if anything need to be handled from API/Servlet  or third Party Portal only ? 

 

https://experienceleaguecommunities.adobe.com/t5/adobe-experience-manager-assets/servlet-code-to-download-dam-images/td-p/566157

 

Thanks in advance !

 

Note: Client don't want to download assets in ZIP format , so using above code in AEM servlet. 

Este tema ha sido cerrado para respuestas.
Mejor respuesta de Jagadeesh_Prakash

@an1-3  Let me know if that worked after increase time for timeout. For me with 500 MB of asset below code worked 

 

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
import org.osgi.service.component.annotations.Component;

@Component(
service = { javax.servlet.Servlet.class },
property = {
"sling.servlet.methods=GET",
"sling.servlet.paths=/bin/downloadlargeasset"
}
)
public class DownloadLargeAssetServlet extends SlingSafeMethodsServlet {

@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response)
throws ServletException, IOException {
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=largefile.txt");

// Simulating the creation of a large file (500 MB)
InputStream largeFileStream = createLargeFile();

try (ServletOutputStream outputStream = response.getOutputStream()) {
// Stream the content in chunks to avoid loading the entire file into memory
IOUtils.copyLarge(largeFileStream, outputStream);
} finally {
IOUtils.closeQuietly(largeFileStream);
}
}

private InputStream createLargeFile() {
// Simulate creating a large file (500 MB)
byte[] largeFileContent = new byte[500 * 1024 * 1024];
for (int i = 0; i < largeFileContent.length; i++) {
largeFileContent[i] = (byte) (i % 256);
}
return IOUtils.toInputStream(new String(largeFileContent));
}
}

4 respuestas

Jagadeesh_Prakash
Community Advisor
Community Advisor
November 29, 2023

@an1-3  can you try setting below header once and try. Let me know if this is working

response.setHeader("Transfer-Encoding", "chunked"); 

 

And also tell me what size of asset is not working for you 

An1-3Autor
Level 4
November 30, 2023

Thanks @jagadeesh_prakash ! Issue is happening for assets above 500 MB. I tried to download assets directly from my custom servlet and its working fine. Added above header as well but still same . Might be I need to ask consumer to increase time for timeout as big binary will take time to send the response. 

Jagadeesh_Prakash
Community Advisor
Community Advisor
November 30, 2023

@an1-3  Let me know if that worked after increase time for timeout. For me with 500 MB of asset below code worked 

 

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
import org.osgi.service.component.annotations.Component;

@Component(
service = { javax.servlet.Servlet.class },
property = {
"sling.servlet.methods=GET",
"sling.servlet.paths=/bin/downloadlargeasset"
}
)
public class DownloadLargeAssetServlet extends SlingSafeMethodsServlet {

@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response)
throws ServletException, IOException {
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=largefile.txt");

// Simulating the creation of a large file (500 MB)
InputStream largeFileStream = createLargeFile();

try (ServletOutputStream outputStream = response.getOutputStream()) {
// Stream the content in chunks to avoid loading the entire file into memory
IOUtils.copyLarge(largeFileStream, outputStream);
} finally {
IOUtils.closeQuietly(largeFileStream);
}
}

private InputStream createLargeFile() {
// Simulate creating a large file (500 MB)
byte[] largeFileContent = new byte[500 * 1024 * 1024];
for (int i = 0; i < largeFileContent.length; i++) {
largeFileContent[i] = (byte) (i % 256);
}
return IOUtils.toInputStream(new String(largeFileContent));
}
}

Sudheer_Sundalam
Community Advisor
Community Advisor
November 29, 2023

@an1-3 ,

Try enabling Gzip response for your servlet.

response.setHeader("Content-Encoding", "gzip");

https://experienceleaguecommunities.adobe.com/t5/adobe-experience-manager/enabling-gzip-in-aem-dispatcher-web/m-p/163999 

arunpatidar
Community Advisor
Community Advisor
November 30, 2023
kautuk_sahni
Community Manager
Community Manager
December 4, 2023

@an1-3 Did you find the suggestions from users helpful? Please let us know if more information is required. Otherwise, please mark the answer as correct for posterity. If you have found out solution yourself, please share it with the community.

Kautuk Sahni