/* =============================================================================== * * Part of the InfoGlue Content Management Platform (www.infoglue.org) * * =============================================================================== * * Copyright (C) * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 2, as published by the * Free Software Foundation. See the file LICENSE.html for more information. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY, including 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, write to the Free Software Foundation, Inc. / 59 Temple * Place, Suite 330 / Boston, MA 02111-1307 / USA. * * =============================================================================== */ package org.infoglue.deliver.taglib.common; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.servlet.jsp.JspException; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.log4j.Logger; import org.infoglue.deliver.taglib.TemplateControllerTag; /** * This tag will get a cookie value */ public class ParseMultipartTag extends TemplateControllerTag { public final static Logger logger = Logger.getLogger(ParseMultipartTag.class.getName()); /** * The universal version identifier. */ private static final long serialVersionUID = 8603406098980150888L; private Integer maxSize = new Integer(100000); private String allowedContentTypes; private String[] allowedContentTypeArray; private boolean ignoreEmpty = false; /** * Default constructor. */ public ParseMultipartTag() { super(); } /** * Process the end tag. Sets a cookie. * * @return indication of whether to continue evaluating the JSP page. * @throws JspException if an error occurred while processing this tag. */ public int doEndTag() throws JspException { Map parameters = new HashMap(); try { //Create a factory for disk-based file items DiskFileItemFactory factory = new DiskFileItemFactory(); //Set factory constraints factory.setSizeThreshold(maxSize.intValue()); //factory.setRepository(new File(CmsPropertyHandler.getDigitalAssetPath())); //Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); //Set overall request size constraint upload.setSizeMax(this.maxSize.intValue()); if(upload.isMultipartContent(this.getController().getHttpServletRequest())) { //Parse the request List items = upload.parseRequest(this.getController().getHttpServletRequest()); List files = new ArrayList(); //Process the uploaded items Iterator iter = items.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); if (!item.isFormField()) { String fieldName = item.getFieldName(); String fileName = item.getName(); String contentType = item.getContentType(); boolean isInMemory = item.isInMemory(); long sizeInBytes = item.getSize(); if(isValidContentType(contentType)) { files.add(item); } else { if((item.getName() == null || item.getName().equals("")) && this.ignoreEmpty) { logger.warn("Empty file but that was ok.."); } else { pageContext.setAttribute("status", "nok"); pageContext.setAttribute("upload_error", "A field did not have a valid content type"); pageContext.setAttribute(fieldName + "_error", "Not a valid content type"); //throw new JspException("Not a valid content type"); } } } else { String name = item.getFieldName(); String value = item.getString(); String oldValue = (String)parameters.get(name); if(oldValue != null) value = oldValue + "," + value; if(value != null) { try { String fromEncoding = "iso-8859-1"; String toEncoding = "utf-8"; String testValue = new String(value.getBytes(fromEncoding), toEncoding); if(testValue.indexOf((char)65533) == -1) value = testValue; } catch(Exception e) { e.printStackTrace(); } } parameters.put(name, value); } } parameters.put("files", files); setResultAttribute(parameters); } else { setResultAttribute(null); } } catch(Exception e) { logger.warn("Error doing an upload" + e.getMessage(), e); //pageContext.setAttribute("fieldName_exception", "contentType_MAX"); //throw new JspException("File upload failed: " + e.getMessage()); pageContext.setAttribute("status", "nok"); pageContext.setAttribute("upload_error", "" + e.getMessage()); } return EVAL_PAGE; } private boolean isValidContentType(String contentType) { boolean valid = false; for(int i=0; i<this.allowedContentTypeArray.length; i++) { if(this.allowedContentTypeArray[i].equalsIgnoreCase(contentType)) valid = true; } return valid; } public void setMaxSize(String maxSize) throws JspException { this.maxSize = evaluateInteger("FileUploadTag", "maxSize", maxSize); } public void setAllowedContentTypes(String allowedContentTypes) throws JspException { this.allowedContentTypes = evaluateString("FileUploadTag", "allowedContentTypes", allowedContentTypes); this.allowedContentTypeArray = this.allowedContentTypes.split(","); } public void setIgnoreEmpty(boolean ignoreEmpty) { this.ignoreEmpty = ignoreEmpty; } }