package org.jboss.seam.wiki.core.ui; import org.jboss.seam.wiki.core.dao.WikiNodeDAO; import org.jboss.seam.wiki.core.model.WikiUpload; import org.jboss.seam.wiki.core.model.WikiUploadImage; import org.jboss.seam.contexts.Contexts; import org.jboss.seam.servlet.ContextualHttpServletRequest; import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.Log; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; public class FileServlet extends HttpServlet { private static final Log log = LogFactory.getLog(FileServlet.class); private static final String DOWNLOAD_PATH = "/download.seam"; private byte[] fileNotFoundImage; public FileServlet() { InputStream in = getClass().getResourceAsStream("/img/filenotfound.png"); if (in != null) { ByteArrayOutputStream out = new ByteArrayOutputStream(); byte[] buffer = new byte[512]; try { int read = in.read(buffer); while (read != -1) { out.write(buffer, 0, read); read = in.read(buffer); } fileNotFoundImage = out.toByteArray(); } catch (IOException e) { } } } @Override protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException { new ContextualHttpServletRequest(request) { @Override public void process() throws Exception { doWork(request, response); } }.run(); } // TODO: All data access in this method runs with auto-commit mode, see http://jira.jboss.com/jira/browse/JBSEAM-957 protected void doWork(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if (DOWNLOAD_PATH.equals(request.getPathInfo())) { String id = request.getParameter("fileId"); Contexts.getSessionContext().set("LAST_ACCESS_ACTION", "File: " + id); WikiUpload file = null; if (!"".equals(id)) { Long fileId = null; try { fileId = Long.valueOf(id); } catch (NumberFormatException ex) { response.sendError(HttpServletResponse.SC_NOT_FOUND, "File" + id); } WikiNodeDAO wikiNodeDAO = (WikiNodeDAO)org.jboss.seam.Component.getInstance(WikiNodeDAO.class); file = wikiNodeDAO.findWikiUpload(fileId); } String contentType = null; byte[] data = null; String thumbnail = request.getParameter("thumbnail"); if (file != null && thumbnail != null && Boolean.valueOf(thumbnail) && file.isInstance(WikiUploadImage.class) && ((WikiUploadImage)file).getThumbnailData() != null && ((WikiUploadImage)file).getThumbnailData().length >0) { // Render thumbnail picture contentType = file.getContentType(); data = ((WikiUploadImage)file).getThumbnailData(); } else if (file != null && file.getData() != null && file.getData().length > 0) { // Render file regularly contentType = file.getContentType(); data = file.getData(); } else if (fileNotFoundImage != null) { contentType = "image/png"; data = fileNotFoundImage; } if (data != null) { response.setContentType(contentType); response.setContentLength(data.length); // If it's not a picture or if it's a picture that is an attachment, tell the browser to download // the file instead of displaying it // TODO: What about PDFs? Lot's of people want to show PDFs inline... if ( file != null && ( !file.isInstance(WikiUploadImage.class) || file.isAttachedToDocuments() ) ) { response.setHeader("Content-Disposition", "attachement; filename=\"" + file.getFilename() + "\"" ); } response.getOutputStream().write(data); } response.getOutputStream().flush(); } } }