使用commons-fileupload上傳簡單實現

首先,要使用“commons-fileupload”,必需有“commons-io”包。 

 

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

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;

public class Request {

    private Map parameters;// 保存普通form表單域

    private Map fileMap;// 保存文件

    private String encoding = "GBK"; // 字符編碼,當讀取上傳表單的各部分時會用到該encoding

    private long sizeMax = -1;

    private long filesSize = 0; // 所有文件的總大小

    /**
     * @param request
     * @throws UnsupportedEncodingException
     */
    public Request(HttpServletRequest request)
            throws UnsupportedEncodingException {

        this.parameters = new HashMap();

        this.fileMap = new HashMap();

        DiskFileItemFactory factory = new DiskFileItemFactory();

        factory.setSizeThreshold(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD);

        ServletFileUpload upload = new ServletFileUpload(factory);

        upload.setHeaderEncoding(this.encoding);

        try {
            List items = upload.parseRequest(request);

            for (int i = 0; i < items.size(); i++) {
                FileItem item = (FileItem) items.get(i);
                if (item.isFormField()) {
                    String fieldName = item.getFieldName();
                    String value = item.getString(this.encoding);
                    if (this.parameters.containsKey(fieldName)) {
                        String value1 = (String) this.parameters.get(fieldName);
                        this.parameters.put(fieldName, value1.replace(',', ',')
                                + "," + value.replace(',', ','));
                    } else
                        this.parameters.put(fieldName, value);
                } else {

                    if (!isValidFile(item))
                        continue;

                    this.fileMap.put(item.getFieldName(), item);
                    this.filesSize += item.getSize();
                }
            }

        } catch (FileUploadException e) {
            e.printStackTrace();
        }
    }

    /**
     * 上傳文件
     * @param field 字段名
     * @param path 完整文件路徑
     * @throws Exception
     */
    public void save(String field, String path) throws Exception {
        if (this.fileMap.isEmpty())
            return;

        if (this.sizeMax > -1 && this.filesSize > this.sizeMax) {
            String message = "the request was rejected because its size "
                    + this.filesSize + " exceeds the configured maximum "
                    + this.sizeMax;

            throw new org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException(
                    message, this.filesSize, this.sizeMax);
        }

        Iterator iter = this.fileMap.keySet().iterator();
        while (iter.hasNext()) {
            Object key = iter.next();
            FileItem item = (FileItem) this.fileMap.get(key);

            if (key.equals(field))
                item.write(new File(path));
        }

    }

    public String getParameter(String key) {
        return (String) this.parameters.get(key);
    }

    public FileItem getFile(String key) {
        return (FileItem) this.fileMap.get(key);
    }

    /**
     * 驗證文件是否有效
     * @param item
     * @return
     */
    private boolean isValidFile(FileItem item) {
        return item == null || item.getName() == "" || item.getSize() == 0 ? false
                : true;
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章