package com.processpuzzle.file.control; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Calendar; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.processpuzzle.application.configuration.domain.ProcessPuzzleContext; import com.processpuzzle.artifact.domain.FileStorage; import com.processpuzzle.artifact.domain.FileStorageRepository; import com.processpuzzle.persistence.domain.DefaultUnitOfWork; import com.processpuzzle.user_session.domain.UserRequestManager; public class DownloadFile extends HttpServlet { private static final long serialVersionUID = -5495466682128172989L; public void init(ServletConfig config) throws ServletException { super.init(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { DefaultUnitOfWork work = new DefaultUnitOfWork(true); BufferedInputStream inputFile = null; FileStorage fileStorage = null; if (request.getParameter("fileId") != null) { try { Integer id = Integer.valueOf((String) request.getParameter("fileId")); ProcessPuzzleContext applicationContext = UserRequestManager.getInstance().getApplicationContext(); FileStorageRepository fileStorageRepository = applicationContext.getRepository( FileStorageRepository.class); fileStorage = fileStorageRepository.findFileStorageById(work, id); inputFile = new BufferedInputStream(new FileInputStream(new java.io.File(fileStorage.getSource()))); response.setContentType(fileStorage.getContentType()); response.setCharacterEncoding("UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileStorage.getOriginalFileName()); response.setDateHeader("UploadedDate", fileStorage.getUploadDate().getTime()); response.setDateHeader("DownloadedDate", Calendar.getInstance().getTimeInMillis()); if (fileStorage.getSize().longValue() > Integer.MAX_VALUE) response.setContentLength(Integer.MAX_VALUE); // 2MB is the max else response.setContentLength(fileStorage.getSize().intValue()); OutputStream outputStream = response.getOutputStream(); int start = 0; int length = 1024; int offset = -1; byte[] buffer = new byte[length]; while ((offset = inputFile.read(buffer, start, length)) != -1) { outputStream.write(buffer, start, offset); } response.getOutputStream().flush(); } catch (Exception e) { inputFile = null; } finally { if (inputFile != null) { inputFile.close(); } } } work.finish(); } }