1 10 package org.mmbase.bridge.jsp.taglib.util; 11 12 import java.util.*; 13 import javax.servlet.jsp.PageContext ; 14 import javax.servlet.jsp.JspTagException ; 15 import javax.servlet.http.*; 16 import org.mmbase.bridge.jsp.taglib.TaglibException; 17 import org.mmbase.util.logging.Logger; 18 import org.mmbase.util.logging.Logging; 19 import org.apache.commons.fileupload.*; 20 21 26 27 public class MultiPart { 28 private static final Logger log = Logging.getLoggerInstance(MultiPart.class); 29 30 static String MULTIPARTREQUEST_KEY = "__multipart"; 31 32 public static boolean isMultipart(PageContext pageContext) { 33 String ct = ((HttpServletRequest)pageContext.getRequest()).getContentType(); 34 if (ct == null) { 35 return false; 36 } 37 return (ct.startsWith("multipart/")); 38 } 39 40 public static MMultipartRequest getMultipartRequest(PageContext pageContext) { 41 MMultipartRequest multipartRequest = (MMultipartRequest)pageContext.getAttribute(MULTIPARTREQUEST_KEY, PageContext.REQUEST_SCOPE); 42 if (multipartRequest == null) { 43 log.debug("Creating new MultipartRequest"); 44 multipartRequest = new MMultipartRequest((HttpServletRequest)pageContext.getRequest(), ContextContainer.getDefaultCharacterEncoding(pageContext)); 45 log.debug("have it"); 46 47 if (log.isDebugEnabled()) { 48 if (multipartRequest != null) { 49 Iterator paramNames = multipartRequest.getParameterNames(); 50 StringBuffer params = new StringBuffer (); 51 while (paramNames.hasNext()) { 52 params.append(paramNames.next()).append(","); 53 } 54 log.debug("multipart parameters: " + params); 55 } else { 56 log.debug("not a multipart request"); 57 } 58 } 59 pageContext.setAttribute(MULTIPARTREQUEST_KEY, multipartRequest, PageContext.REQUEST_SCOPE); 60 } else { 61 log.debug("Found multipart request on pageContext" + multipartRequest); 62 } 63 return multipartRequest; 64 } 65 66 static public class MMultipartRequest { 67 68 private Map parametersMap = new HashMap(); 69 private String coding = null; 70 71 MMultipartRequest(HttpServletRequest req, String c) { 72 try { 73 DiskFileUpload fu = new DiskFileUpload(); 74 fu.setHeaderEncoding("ISO-8859-1"); List fileItems = fu.parseRequest(req); 76 for (Iterator i = fileItems.iterator(); i.hasNext(); ) { 77 FileItem fi = (FileItem)i.next(); 78 if (fi.isFormField()) { 79 String value; 80 try { 81 value = fi.getString("ISO-8859-1"); 82 } catch(java.io.UnsupportedEncodingException uee) { 83 log.error("could not happen, ISO-8859-1 is supported"); 84 value = fi.getString(); 85 } 86 Object oldValue = parametersMap.get(fi.getFieldName()); 87 if (oldValue == null ) { 88 parametersMap.put(fi.getFieldName(), value); 89 } else if (!(oldValue instanceof FileItem)) { 90 List values; 91 if (oldValue instanceof String ) { 92 values = new ArrayList(); 93 values.add(oldValue); 94 } else { 95 values = (List)oldValue; 96 } 97 values.add(value); 98 parametersMap.put(fi.getFieldName(), values); 99 } 100 } else { 101 parametersMap.put(fi.getFieldName(), fi); 102 } 103 } 104 } catch (FileUploadException e) { 105 log.error(e.getMessage(), e); 106 throw new RuntimeException (e); 107 } 108 coding = c; 109 log.debug("Created with encoding: " + coding); 110 } 111 112 117 public byte[] getBytes(String param) throws JspTagException { 118 log.debug("Getting bytes for " + param); 119 Object value = parametersMap.get(param); 120 if (value instanceof FileItem) { 121 try { 122 return ((FileItem)value).get(); 123 } catch (Exception e) { 124 throw new TaglibException(e); 125 } 126 } else { 127 return null; 128 } 129 } 130 public FileItem getFileItem(String param) throws JspTagException { 131 log.debug("Getting outputstream for " + param); 132 Object value = parametersMap.get(param); 133 if (value instanceof FileItem) { 134 try { 135 return (FileItem)value; 136 } catch (Exception e) { 137 throw new TaglibException(e); 138 } 139 } else { 140 return null; 141 } 142 } 143 144 149 protected String encodeBytesAsString(byte[] data) throws JspTagException { 150 String encoding = coding; 151 byte[] xmlbytes = new byte[60]; 153 int sz = data.length; 154 if (sz > 60) sz = 60; 155 System.arraycopy(data, 0, xmlbytes, 0, sz); 156 String xmltext = new String (xmlbytes); 157 if (xmltext.startsWith("<?xml")) { 158 int i = xmltext.indexOf("encoding"); 159 log.debug("i=*" + i + "*"); 160 if (i > 0) { 161 int j = xmltext.indexOf("?>", i); 162 log.debug("j=*" + j + "*"); 163 if (j > i) { 164 encoding = xmltext.substring(i + 8, j).trim(); 166 encoding = encoding.substring(1).trim(); 168 encoding = encoding.substring(1, encoding.length() - 1).trim(); 170 } 171 } 172 } 173 try { 174 return new String (data, encoding); 175 } catch (java.io.UnsupportedEncodingException e) { 176 throw new TaglibException(e); 177 } 178 } 179 180 183 public boolean isFile(String param) { 184 Object value = parametersMap.get(param); 185 return value instanceof FileItem; 186 } 187 188 195 public Object getParameterValues(String param) throws JspTagException { 196 Object value = parametersMap.get(param); 198 200 if (value instanceof FileItem) { 201 try { 202 return encodeBytesAsString(((FileItem)value).get()); 203 } catch (Exception e) { 204 throw new TaglibException(e); 205 } 206 } else { 207 return value; 208 } 209 } 210 211 public Iterator getParameterNames() { 212 return parametersMap.keySet().iterator(); 213 } 214 } 215 216 } 217 | Popular Tags |