Java tutorial
/* * ConcourseConnect * Copyright 2009 Concursive Corporation * http://www.concursive.com * * This file is part of ConcourseConnect, an open source social business * software and community platform. * * Concursive ConcourseConnect is free software: you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License as published * by the Free Software Foundation, version 3 of the License. * * Under the terms of the GNU Affero General Public License you must release the * complete source code for any application that uses any part of ConcourseConnect * (system header files and libraries used by the operating system are excluded). * These terms must be included in any work that has ConcourseConnect components. * If you are developing and distributing open source applications under the * GNU Affero General Public License, then you are free to use ConcourseConnect * under the GNU Affero General Public License. * * If you are deploying a web site in which users interact with any portion of * ConcourseConnect over a network, the complete source code changes must be made * available. For example, include a link to the source archive directly from * your web site. * * For OEMs, ISVs, SIs and VARs who distribute ConcourseConnect with their * products, and do not license and distribute their source code under the GNU * Affero General Public License, Concursive provides a flexible commercial * license. * * To anyone in doubt, we recommend the commercial license. Our commercial license * is competitively priced and will eliminate any confusion about how * ConcourseConnect can be used and distributed. * * ConcourseConnect 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 Affero General Public License for more * details. * * You should have received a copy of the GNU Affero General Public License * along with ConcourseConnect. If not, see <http://www.gnu.org/licenses/>. * * Attribution Notice: ConcourseConnect is an Original Work of software created * by Concursive Corporation */ package com.concursive.connect.web.modules.documents.beans; import com.concursive.commons.text.StringUtils; import com.concursive.commons.web.mvc.actions.ActionContext; import com.concursive.connect.web.modules.documents.dao.Thumbnail; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import javax.portlet.RenderResponse; import javax.servlet.ServletOutputStream; import java.io.*; /** * Description of the Class * * @author matt rajkowski * @version $Id$ * @created December 17, 2001 */ public class FileDownload { private static Log LOG = LogFactory.getLog(FileDownload.class); private String fullPath = null; private String displayName = null; private long fileTimestamp = 0; /** * The complete path and filename of the file to be sent. * * @param tmp The new FullPath value */ public void setFullPath(String tmp) { this.fullPath = tmp; } /** * The filename that should be shown to the user's browser. * * @param tmp The new DisplayName value */ public void setDisplayName(String tmp) { this.displayName = tmp; } /** * The complete path and filename of the file to be sent. * * @return The FullPath value */ public String getFullPath() { return fullPath; } /** * The filename that should be shown to the user's browser. * * @return The DisplayName value */ public String getDisplayName() { return displayName; } public long getFileTimestamp() { return fileTimestamp; } public void setFileTimestamp(long fileTimestamp) { this.fileTimestamp = fileTimestamp; } /** * Description of the Method */ public FileDownload() { } /** * Returns whether the file exists. * * @return Description of the Returned Value */ public boolean fileExists() { if (fullPath == null) { return false; } File downloadFile = new File(fullPath); return downloadFile.exists(); } public static String getContentType(String filename) { String contentType = "application/octet-stream"; if (filename.endsWith(".bmp")) { contentType = "image/bmp"; } else if (filename.endsWith(".css")) { contentType = "text/plain"; } else if (filename.endsWith(".csv")) { contentType = "text/csv"; } else if (filename.endsWith(".doc")) { contentType = "application/msword"; } else if (filename.endsWith(".dot")) { contentType = "application/msword"; } else if (filename.endsWith(".eps")) { contentType = "application/postscript"; } else if (filename.endsWith(".gif")) { contentType = "image/gif"; } else if (filename.endsWith(".htm")) { contentType = "text/html"; } else if (filename.endsWith(".html")) { contentType = "text/html"; } else if (filename.endsWith(".java")) { contentType = "text/plain"; } else if (filename.endsWith(".jpeg")) { contentType = "image/jpeg"; } else if (filename.endsWith(".jpg")) { contentType = "image/jpeg"; } else if (filename.endsWith(".js")) { contentType = "application/x-javascript"; } else if (filename.endsWith(".mdb")) { contentType = "application/x-msaccess"; } else if (filename.endsWith(".mid")) { contentType = "audio/mid"; } else if (filename.endsWith(".midi")) { contentType = "audio/mid"; } else if (filename.endsWith(".mp3")) { contentType = "audio/mpeg"; } else if (filename.endsWith(".mpp")) { contentType = "application/vnd.ms-project"; } else if (filename.endsWith(".pdf")) { contentType = "application/pdf"; } else if (filename.endsWith(".png")) { contentType = "image/png"; } else if (filename.endsWith(".pot")) { contentType = "application/vnd.ms-powerpoint"; } else if (filename.endsWith(".pps")) { contentType = "application/vnd.ms-powerpoint"; } else if (filename.endsWith(".ppt")) { contentType = "application/vnd.ms-powerpoint"; } else if (filename.endsWith(".ps")) { contentType = "application/postscript"; } else if (filename.endsWith(".rtf")) { contentType = "application/rtf"; } else if (filename.endsWith(".sql")) { contentType = "text/plain"; } else if (filename.endsWith(".swf")) { contentType = "application/x-shockwave-flash"; } else if (filename.endsWith(".tgz")) { contentType = "application/x-compressed"; } else if (filename.endsWith(".tif")) { contentType = "image/tiff"; } else if (filename.endsWith(".tiff")) { contentType = "image/tiff"; } else if (filename.endsWith(".txt")) { contentType = "text/plain"; } else if (filename.endsWith(".wav")) { contentType = "audio/x-wav"; } else if (filename.endsWith(".wks")) { contentType = "application/vnd.ms-works"; } else if (filename.endsWith(".wps")) { contentType = "application/vnd.ms-works"; } else if (filename.endsWith(".xls")) { contentType = "application/vnd.ms-excel"; } else if (filename.endsWith(".xml")) { contentType = "text/xml"; } else if (filename.endsWith(".xsl")) { contentType = "text/xml"; } else if (filename.endsWith(".zip")) { contentType = "application/x-zip-compressed"; } else if (filename.endsWith("README")) { contentType = "text/plain"; } LOG.debug("File type: " + contentType); return contentType; } public void setStreamingResponse(RenderResponse response) throws Exception { if (fullPath.endsWith("TH")) { // NOTE: A temporary fix because all thumbnails (that are scaled) // are saved as JPG. Actual size thumbnails match the original // filetype (PNG, GIF, JPG) but there is no way to tell response.setContentType(getContentType(".jpg")); } else { response.setContentType(getContentType(this.getDisplayName().toLowerCase())); } } /** * Description of the Method * * @param context Description of the Parameter * @throws Exception Description of the Exception */ public void streamContent(ActionContext context) throws Exception { if (fullPath.endsWith("TH")) { // NOTE: A temporary fix because all thumbnails (that are scaled) // are saved as JPG. Actual size thumbnails match the original // filetype (PNG, GIF, JPG) but there is no way to tell context.getResponse().setContentType(getContentType(".jpg")); } else { context.getResponse().setContentType(getContentType(this.getDisplayName().toLowerCase())); } if (fileTimestamp > 0) { context.getResponse().setDateHeader("Last-Modified", fileTimestamp); //context.getResponse().setDateHeader("Expires", 0); if (fullPath != null) { File downloadFile = new File(fullPath); context.getResponse().setContentLength((int) downloadFile.length()); } } this.send(context); } public void streamThumbnail(ActionContext context, Thumbnail thumbnail) throws Exception { context.getResponse() .setContentType(getContentType("." + StringUtils.getText(thumbnail.getFormat(), "jpg"))); context.getResponse().setContentLength(thumbnail.getSize()); if (fileTimestamp > 0) { context.getResponse().setDateHeader("Last-Modified", fileTimestamp); //context.getResponse().setDateHeader("Expires", 0); } this.send(context); } /** * Description of the Method * * @param context Description of the Parameter * @throws Exception Description of the Exception */ public void sendFile(ActionContext context) throws Exception { sendFile(context, "application/octet-stream"); } /** * Description of the Method * * @param context Description of the Parameter * @param contentType Description of the Parameter * @throws Exception Description of the Exception */ public void sendFile(ActionContext context, String contentType) throws Exception { File downloadFile = new File(fullPath); context.getResponse().setContentType(contentType); if (contentType.startsWith("application")) { context.getResponse().setHeader("Content-Disposition", "attachment; filename=\"" + displayName + "\";"); context.getResponse().setContentLength((int) downloadFile.length()); } this.send(context); } public void setDownloadResponse(RenderResponse response) { response.setContentType("application/octet-stream"); } /** * Description of the Method * * @param context Description of the Parameter * @param bytes Description of the Parameter * @param contentType Description of the Parameter * @throws Exception Description of the Exception */ public void sendFile(ActionContext context, byte[] bytes, String contentType) throws Exception { context.getResponse().setContentType(contentType); if (contentType.startsWith("application")) { context.getResponse().setHeader("Content-Disposition", "attachment; filename=\"" + displayName + "\";"); context.getResponse().setContentLength(bytes.length); } ServletOutputStream outputStream = context.getResponse().getOutputStream(); outputStream.write(bytes, 0, bytes.length); outputStream.flush(); outputStream.close(); } public static void sendFile(ActionContext context, InputStream is, String contentType, String displayName) throws Exception { context.getResponse().setContentType(contentType); if (contentType.startsWith("application")) { context.getResponse().setHeader("Content-Disposition", "attachment; filename=\"" + displayName + "\";"); } ServletOutputStream outputStream = context.getResponse().getOutputStream(); send(outputStream, is); } /** * Description of the Method * * @param context Description of the Parameter * @param bytes Description of the Parameter * @param contentType Description of the Parameter * @throws Exception Description of the Exception */ public static void streamFile(ActionContext context, byte[] bytes, String contentType) throws Exception { context.getResponse().setContentType(contentType); ServletOutputStream outputStream = context.getResponse().getOutputStream(); outputStream.write(bytes, 0, bytes.length); outputStream.flush(); outputStream.close(); } /** * Description of the Method * * @param context Description of the Parameter * @throws Exception Description of the Exception */ private void send(ActionContext context) throws Exception { BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(fullPath)); ServletOutputStream outputStream = context.getResponse().getOutputStream(); send(outputStream, inputStream); } public void send(OutputStream outputStream) throws Exception { BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(fullPath)); send(outputStream, inputStream); } public static void send(OutputStream outputStream, InputStream is) throws Exception { BufferedInputStream inputStream = new BufferedInputStream(is); byte[] buf = new byte[4 * 1024]; // 4K buffer int len; while ((len = inputStream.read(buf, 0, buf.length)) != -1) { outputStream.write(buf, 0, len); } outputStream.flush(); outputStream.close(); inputStream.close(); } /** * Description of the Method * * @param context Description of the Parameter * @param text Description of the Parameter * @throws Exception Description of the Exception */ public void sendTextAsFile(ActionContext context, String text) throws Exception { context.getResponse().setContentType("application/octet-stream"); context.getResponse().setHeader("Content-Disposition", "attachment;filename=" + displayName + ";"); context.getResponse().setContentLength((int) text.length()); ServletOutputStream outputStream = context.getResponse().getOutputStream(); StringReader strReader = new StringReader(text); int data; while ((data = strReader.read()) != -1) { outputStream.write(data); } strReader.close(); outputStream.close(); } }