由于经常用到java上传的组件, 每次都要一行一行的写不是很方便, 所以抽了点时间封装一下, 也为以后方便使用. 底层也是是用apache的upload上传组件, 不过仅仅是封装了一下, 更方便用了而已. 具体的组件是继承了 HttpServletRequest接口. 我们可以象使用jsp中的request一样使用upload组件了. 具体代码如下: FileHttpServletRequest 接口: /* * Created on 2006-7-3 * */ package cn.bloghome.javasky.web; import javax.servlet.http.HttpServletRequest; import org.apache.commons.fileupload.FileItem; public interface FileHttpServletRequest extends HttpServletRequest { FileItem getFileParameter(String key); FileItem[] getFileParameterValues(String key); } 实现类: FileRequestHandler /* * Created on 2006-7-3 * */ package cn.bloghome.javasky.web; import java.io.File; import java.io.Serializable; import java.io.UnsupportedEncodingException; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.servlet.http.HttpServletRequest; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; /** * @author javaSky * */ public class FileRequestHandler implements Serializable, InvocationHandler { /** * */ private static final long serialVersionUID = -2633528184124692029L; private HttpServletRequest req; private boolean isMultipart; private int maxMemorySize; private String tempDirectory; private long maxFileSize; private Map fileMap = new HashMap(); private Map paraMap = new HashMap(); private Map readOnlyParaMap; private FileRequestHandler(HttpServletRequest req) throws FileUploadException{ this.req = req; } private void parseRequest() throws FileUploadException { if(req != null){ isMultipart = ServletFileUpload.isMultipartContent(req); } if(isMultipart){ //Create a factory for disk-based file items DiskFileItemFactory factory = new DiskFileItemFactory(); if(maxMemorySize > 0){ factory.setSizeThreshold(maxMemorySize); } if (tempDirectory != null) { File tmpDir = new File(tempDirectory); if (tmpDir.exists() && tmpDir.isDirectory() && tmpDir.canWrite()) { factory.setRepository(tmpDir); } } // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); if(maxFileSize > 0){ upload.setSizeMax(maxFileSize); } // Parse the request List /* FileItem */ items = upload.parseRequest(req); Map tmpParaMap = new HashMap(); Map tmpFileMap = new HashMap(); for(Iterator it = items.iterator(); it.hasNext();){ FileItem item = (FileItem) it.next(); //if(item.isFormField()){ List list1 = (List) tmpParaMap.get(item.getFieldName()); if(list1 == null){ list1 = new ArrayList(); tmpParaMap.put(item.getFieldName(), list1); } String vl = null; if(item.isFormField()){ try { vl = req.getCharacterEncoding() == null ? item.getString() : item.getString(req.getCharacterEncoding()); } catch (UnsupportedEncodingException e) { //e.printStackTrace(); } }else{ vl = item.getName(); } list1.add(vl); //}//else{ List list2 = (List) tmpFileMap.get(item.getFieldName()); if(list2 == null){ list2 = new ArrayList(); tmpFileMap.put(item.getFieldName(), list2); } list2.add(item); //} } if(tmpParaMap.size() > 0){ for (Iterator it = tmpParaMap.entrySet().iterator(); it.hasNext();){ Entry en = (Entry) it.next(); List vl = (List)en.getValue(); paraMap.put(en.getKey(), vl.toArray(new String[vl.size()])); } } if(tmpFileMap.size() > 0){ for(Iterator it = tmpFileMap.entrySet().iterator(); it.hasNext();){ Entry en = (Entry) it.next(); List vl = (List) en.getValue(); fileMap.put(en.getKey(), vl.toArray(new FileItem[vl.size()])); } } readOnlyParaMap = Collections.unmodifiableMap(paraMap); } } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if(req == null){ return null; } if(isMultipart){ String mName = method.getName(); if (mName.equals("getParameter")) { String para = (String) args[0]; return getParameter(para); }else if(mName.equals("getParameterValues")){ String para = (String) args[0]; return (String[]) paraMap.get(para); }else if(mName.equals("getParameterMap")){ return readOnlyParaMap; }else if(mName.equals("getParameterNames")){ return getParameterNames(); }else if(mName.equals("getFileParameter")){ String para = (String) args[0]; return getFileParameter(para); }else if(mName.equals("getFileParameterValues")){ String para = (String) args[0]; return fileMap.get(para); } } return method.invoke(req, args); } /** * overwrite HttpServletRequest.getParameterNames(String) method. * @return */ public Enumeration getParameterNames(){ Enumeration names = new Enumeration(){ private Iterator it = paraMap.keySet().iterator(); public boolean hasMoreElements() { return it.hasNext(); } public Object nextElement() { return it.next(); } }; return names; } /** * overwrite FileHttpServletRequest.getFileParameter(String) method. * @param key * @return */ public FileItem getFileParameter(String key){ FileItem[] fs = (FileItem[]) fileMap.get(key); if(fs != null && fs.length > 0){ return fs[0]; } return null; } /** * overwrite HttpServletRequest.getParameter(String) method. * @param key * @return */ public String getParameter(String key){ String[] vs = (String[]) paraMap.get(key); if(vs != null && vs.length > 0){ return vs[0]; } return null; } /** * parse request * @param req * @return * @throws FileUploadException */ public static FileHttpServletRequest fileParse(HttpServletRequest req) throws FileUploadException { return fileParse(req, -1, null, -1); } /** * parse request * @param req * @return * @throws FileUploadException */ public static FileHttpServletRequest fileParse(HttpServletRequest req, int maxMemorySize, String tempDirectory, int maxFileSize) throws FileUploadException { FileRequestHandler handler = new FileRequestHandler(req); handler.maxFileSize = maxFileSize; handler.maxMemorySize = maxMemorySize; handler.tempDirectory = tempDirectory; handler.parseRequest(); FileHttpServletRequest req1 = (FileHttpServletRequest) Proxy .newProxyInstance(FileRequestHandler.class.getClassLoader(), new Class[] { FileHttpServletRequest.class }, handler); return req1; } } 如何使用: 使用的是创建模式中的工厂方法模式, 我们可以如此创建, FileHttpServletRequest req = FileRequestHandler.fileParse(request); 接下来就可以象使用request一样使用它了.