package com.constellio.app.ui.application; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.constellio.app.modules.rm.services.RMSchemasRecordsServices; import com.constellio.app.modules.rm.wrappers.Document; import com.constellio.app.services.factories.AppLayerFactory; import com.constellio.app.services.factories.ConstellioFactories; import com.constellio.data.io.services.facades.IOServices; import com.constellio.model.entities.records.ContentVersion; import com.constellio.model.entities.records.Record; import com.constellio.model.services.contents.ContentManager; import com.constellio.model.services.factories.ModelLayerFactory; public class DownloadServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException { String documentId = req.getParameter("id"); ConstellioFactories constellioFactories = ConstellioFactories.getInstance(); ModelLayerFactory modelLayerFactory = constellioFactories.getModelLayerFactory(); AppLayerFactory appLayerFactory = constellioFactories.getAppLayerFactory(); ContentManager contentManager = modelLayerFactory.getContentManager(); IOServices ioServices = modelLayerFactory.getIOServicesFactory().newIOServices(); Record record = modelLayerFactory.newRecordServices().getDocumentById(documentId); RMSchemasRecordsServices rm = new RMSchemasRecordsServices(record.getCollection(), appLayerFactory); Document document = rm.wrapDocument(record); if (document.isPublished() && document.getContent() != null) { ContentVersion version = document.getContent().getLastMajorContentVersion(); if (version == null) { version = document.getContent().getCurrentVersion(); } InputStream inputStream = null; try { inputStream = contentManager.getContentInputStream(version.getHash(), "download"); // modifies response response.setContentType(version.getMimetype()); response.setContentLength((int) version.getLength()); // forces download String headerKey = "Content-Disposition"; String headerValue = String.format("attachment; filename=\"%s\"", version.getFilename()); response.setHeader(headerKey, headerValue); // obtains response's output stream OutputStream outStream = response.getOutputStream(); byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outStream.write(buffer, 0, bytesRead); } outStream.close(); } finally { ioServices.closeQuietly(inputStream); } } } }