⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filerequesthandler.java

📁 一套购物车项目。电子商务系统。实现了前台和后台的业务逻辑。
💻 JAVA
字号:
package com.softfz.jn0708.util;


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 student
 *
 */

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;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -