@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));
}
}