1 9 package org.lucane.server.web; 10 11 import java.io.ByteArrayOutputStream ; 12 import java.io.IOException ; 13 import java.io.InputStream ; 14 import java.io.OutputStream ; 15 import java.util.Hashtable ; 16 17 import javax.activation.DataHandler ; 18 import javax.activation.DataSource ; 19 import javax.mail.MessagingException ; 20 import javax.mail.internet.MimeBodyPart ; 21 import javax.mail.internet.MimeMultipart ; 22 import javax.mail.internet.MimeUtility ; 23 24 31 public class FormdataMultipart extends MimeMultipart { 32 33 private Hashtable m_Params=new Hashtable (); 35 private boolean m_Removed=false; 36 37 43 public FormdataMultipart() { 44 super(); 45 } 47 57 public FormdataMultipart(DataSource ds) 58 throws MessagingException ,IOException { 59 60 super(ds); 61 processBodyParts(); 62 updateHeaders(); 63 } 65 71 public Hashtable getParameters() { 72 return m_Params; 73 } 75 84 private void processBodyParts() 85 throws IOException ,MessagingException { 86 87 92 93 for(int i=0; i<getCount(); i++){ 94 MimeBodyPart mbp=(MimeBodyPart )getBodyPart(i); 95 processBodyPart(mbp); 96 if(m_Removed) { 97 m_Removed=false; 98 i--; 100 } 101 } 102 setSubType("mixed"); 103 } 108 119 private void processBodyPart(MimeBodyPart mbp) 120 throws MessagingException ,IOException { 121 122 123 String contenttype=new String (mbp.getContentType()); 124 126 String [] cts=mbp.getHeader("Content-Type"); 128 if(cts==null || cts.length==0){ 129 String controlname=extractName( 132 (mbp.getHeader("Content-Disposition"))[0]); 133 134 InputStream in=mbp.getInputStream(); 137 String [] encoding=mbp.getHeader("Content-Transfer-Encoding"); 138 if(encoding!=null && encoding.length>0){ 139 in=MimeUtility.decode(in,encoding[0]); 140 } 141 142 String value=extractValue(in); 143 if(value!=null || !value.trim().equals("")) { 144 addParameter(controlname,value); 145 } 146 m_Removed=true; 148 removeBodyPart(mbp); 149 } else { 150 String filename=extractFileName( 151 (mbp.getHeader("Content-Disposition"))[0]); 152 153 if(filename.equals("")) { 157 m_Removed=true; 159 removeBodyPart(mbp); 160 } else { 161 162 164 int lastindex=filename.lastIndexOf("\\"); 167 if(lastindex!=-1) { 168 filename=filename.substring(lastindex+1,filename.length()); 169 } 170 171 173 InputStream in=mbp.getInputStream(); 175 String [] encoding=mbp.getHeader("Content-Transfer-Encoding"); 176 if(encoding!=null && encoding.length>0){ 177 in=MimeUtility.decode(in,encoding[0]); 178 } 179 ByteArrayOutputStream bout=new ByteArrayOutputStream (); 180 OutputStream out=(OutputStream ) bout; 181 182 int i=0; 183 while((i=in.read())!=-1) { 184 out.write(i); 186 } 187 out.flush(); 188 out.close(); 189 190 MimeBodyPartDataSource mbpds= 192 new MimeBodyPartDataSource( 193 contenttype,filename,bout.toByteArray() 194 ); 195 196 197 mbp.removeHeader("Content-Disposition"); 200 mbp.addHeader( 201 "Content-Disposition","attachment; filename=\""+ 202 filename+ 203 "\"" 204 ); 205 206 mbp.addHeader("Content-Transfer-Encoding","base64"); 208 mbp.setDataHandler(new DataHandler (mbpds)); 209 } 210 } 211 } 213 224 private String extractName(String disposition) 225 throws IOException { 226 227 int end=0; 228 int start=-1; 229 230 start=disposition.indexOf("name=\""); 231 end=disposition.indexOf("\"",start+7); if (start==-1 || end==-1) { 233 throw new IOException ("Mime header malformed."); 234 } 235 return disposition.substring(start+6,end); 236 } 238 249 private String extractFileName(String disposition) 250 throws IOException { 251 252 int end=0; 253 int start=-1; 254 255 start=disposition.indexOf("filename=\""); 256 end=disposition.indexOf("\"",start+10); if (start==-1 || end==-1) { 258 throw new IOException ("Mime header malformed."); 259 } 260 return disposition.substring(start+10,end); 261 } 263 275 private String extractValue(InputStream in) 276 throws IOException { 277 278 ByteArrayOutputStream out=new ByteArrayOutputStream (); 279 int i=0; 280 while ((i=in.read())!=-1) { 281 out.write(i); 282 } 283 out.flush(); 284 out.close(); 285 in.close(); 286 287 return out.toString("iso-8859-1"); 290 } 292 300 private void addParameter(String name, String value) { 301 String values[]; 302 303 305 if (m_Params.containsKey(name)) { 306 String oldValues[]=(String [])m_Params.get(name); 307 values=new String [oldValues.length + 1]; 308 for (int i = 0; i < oldValues.length; i++) { 309 values[i] = oldValues[i]; 310 } 311 values[oldValues.length]=value; 312 } else { 313 values=new String [1]; 314 values[0]=value; 315 } 316 m_Params.put(name, values); 317 } 319 } | Popular Tags |