package org.activityinfo.server.attachment; /* * #%L * ActivityInfo Server * %% * Copyright (C) 2009 - 2013 UNICEF * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; import org.activityinfo.legacy.shared.command.CreateSiteAttachment; import org.activityinfo.server.command.DispatcherSync; import org.activityinfo.server.database.hibernate.entity.SiteAttachment; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.servlet.ServletFileUpload; import javax.persistence.EntityManager; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @Singleton public class AttachmentServlet extends HttpServlet { private AttachmentService service; private DispatcherSync dispatcher; private Provider<EntityManager> entityManager; private static final Logger LOGGER = Logger.getLogger(AttachmentServlet.class.getName()); @Inject public AttachmentServlet(AttachmentService service, Provider<EntityManager> entityManager, DispatcherSync dispatcher) { this.service = service; this.entityManager = entityManager; this.dispatcher = dispatcher; } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String key = req.getParameter("blobId"); SiteAttachment attachment = entityManager.get().find(SiteAttachment.class, key); resp.setHeader("Content-Disposition", "attachment; filename=\"" + attachment.getFileName() + "\""); resp.setContentType(attachment.getContentType()); service.serveAttachment(key, resp); } @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { String key = request.getParameter("blobId"); Integer siteId = Integer.valueOf(request.getParameter("siteId")); FileItem fileItem = getFirstUploadFile(request); String fileName = fileItem.getName(); InputStream uploadingStream = fileItem.getInputStream(); service.upload(key, fileItem, uploadingStream); CreateSiteAttachment siteAttachment = new CreateSiteAttachment(); siteAttachment.setSiteId(siteId); siteAttachment.setBlobId(key); siteAttachment.setFileName(fileName); siteAttachment.setBlobSize(fileItem.getSize()); siteAttachment.setContentType(fileItem.getContentType()); dispatcher.execute(siteAttachment); } catch (Exception e) { LOGGER.log(Level.SEVERE, "Error handling upload", e); response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } } private FileItem getFirstUploadFile(HttpServletRequest request) throws FileUploadException { boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (isMultipart) { FileItemFactory factory = service.createFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); List<FileItem> items = upload.parseRequest(request); for (FileItem item : items) { return item; } } throw new RuntimeException("No upload provided"); } }