/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/velocity/trunk/tool/src/java/org/sakaiproject/util/FileItem.java $ * $Id: FileItem.java 123550 2013-05-02 23:09:33Z matthew@longsight.com $ *********************************************************************************** * * Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008 The Sakai Foundation * * Licensed under the Educational Community License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.opensource.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **********************************************************************************/ package org.sakaiproject.util; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; /** * <p> * FileItem is ... * </p> */ public class FileItem { /** The chunk size used when streaming (100k). */ protected static final int STREAM_BUFFER_SIZE = 102400; /** Body stored in memory, filled in using this stream. */ protected ByteArrayOutputStream m_body = new ByteArrayOutputStream(); protected byte[] m_bodyBytes = null; /** file name. */ protected String m_name = null; /** file type. */ protected String m_type = null; /** Stream from which body can be read */ protected InputStream m_inputStream; /** * Construct * * @param fileName * The file name. * @param fileType * The file type. */ public FileItem(String fileName, String fileType) { if (fileName != null) m_name = fileName.trim(); if (fileType != null) m_type = fileType.trim(); m_body = null; m_bodyBytes = null; m_inputStream = null; } public FileItem(String fileName, String fileType, byte[] body) { if (fileName != null) m_name = fileName.trim(); if (fileType != null) m_type = fileType.trim(); m_body = null; m_bodyBytes = body; m_inputStream = null; } public FileItem(String fileName, String fileType, InputStream stream) { if (fileName != null) m_name = fileName.trim(); if (fileType != null) m_type = fileType.trim(); m_body = null; m_bodyBytes = null; m_inputStream = stream; } /** */ public String getFileName() { return m_name; } /** */ public String getContentType() { return m_type; } /** * Access the body as a String. */ public String getString() { String rv = null; if(m_body == null && m_bodyBytes == null && this.m_inputStream != null) { stream2bodyBytes(); } try { // this should give us byte for byte translation, no encoding/decoding if (m_body != null) { rv = m_body.toString("ISO8859_1"); } else { rv = new String(m_bodyBytes, "ISO8859_1"); } } catch (UnsupportedEncodingException ignore) { } m_body = null; m_bodyBytes = null; return rv; } /** * Access the body as a byte array. This consumes the entry. */ public byte[] get() { if(m_body == null && m_bodyBytes == null && this.m_inputStream != null) { stream2bodyBytes(); } if (m_body != null) { byte[] content = m_body.toByteArray(); m_body = null; return content; } else { byte[] content = m_bodyBytes; m_bodyBytes = null; return content; } } /** * Access the input stream from which the body can be read. * @return */ public InputStream getInputStream() { return this.m_inputStream; } /** */ OutputStream getOutputStream() { return m_body; } protected void stream2bodyBytes() { if(this.m_inputStream != null) { m_body = new ByteArrayOutputStream(); // chunk byte[] chunk = new byte[STREAM_BUFFER_SIZE]; int lenRead; try { while ((lenRead = this.m_inputStream.read(chunk)) != -1) { m_body.write(chunk, 0, lenRead); } } catch (IOException ignoree) { } finally { if(m_inputStream != null) { try { m_inputStream.close(); m_inputStream = null; } catch (IOException e) { } } } } } }