一个java上传文件的组件

由于经常用到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一样使用它了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值