jFinal + Apache Commons FileUpload 實現上傳

碼頭工人 8年前發布 | 3K 次閱讀 Java Fedora VirtualBox

jFinal + Apache Commons FileUpload 實現上傳
</div>

 

該代碼基于JFinal源碼    

/**
 * Copyright (c) 2011-2013, James Zhan 詹波 (jfinal@126.com).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.jfinal.upload;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.naming.SizeLimitExceededException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.util.Streams;

import com.halo.util.IOUtil;
import com.halo.validator.MobileValidator;

/**
 * MultipartRequest.
 */
@SuppressWarnings({ "rawtypes", "unchecked" })
public class MultipartRequest extends HttpServletRequestWrapper {

    private static String saveDirectory;
    private static int maxPostSize;
    private static String encoding;

    private List<UploadFile> uploadFiles;

    private ServletFileUpload upload;

    private Map<String, String> params = new HashMap<String, String>();
    private boolean sizeLimitExceeded;

    static void init(String saveDirectory, int maxPostSize, String encoding) {
        MultipartRequest.saveDirectory = saveDirectory;
        MultipartRequest.maxPostSize = maxPostSize;
        MultipartRequest.encoding = encoding;
    }

    public MultipartRequest(HttpServletRequest request, String saveDirectory,
            int maxPostSize, String encoding) {
        super(request);
        wrapMultipartRequest(request, saveDirectory, maxPostSize, encoding);
    }

    public MultipartRequest(HttpServletRequest request, String saveDirectory,
            int maxPostSize) {
        super(request);
        wrapMultipartRequest(request, saveDirectory, maxPostSize, encoding);
    }

    public MultipartRequest(HttpServletRequest request, String saveDirectory) {
        super(request);
        wrapMultipartRequest(request, saveDirectory, maxPostSize, encoding);
    }

    public MultipartRequest(HttpServletRequest request) {
        super(request);
        wrapMultipartRequest(request, saveDirectory, maxPostSize, encoding);
    }

    /**
     * 添加對相對路徑的支持 1: 以 "/" 開頭或者以 "x:開頭的目錄被認為是絕對路徑 2: 其它路徑被認為是相對路徑, 需要
     * JFinalConfig.uploadedFileSaveDirectory 結合
     */
    private String handleSaveDirectory(String saveDirectory) {
        if (saveDirectory.startsWith("/") || saveDirectory.indexOf(":") == 1)
            return saveDirectory;
        else
            return MultipartRequest.saveDirectory + saveDirectory;
    }

    private void wrapMultipartRequest(HttpServletRequest request,
            String saveDirectory, int maxPostSize, String encoding) {

        saveDirectory = handleSaveDirectory(saveDirectory);

        File dir = new File(saveDirectory);
        if (!dir.exists())
            if (!dir.mkdirs())
                throw new RuntimeException("Directory " + saveDirectory
                        + " not exists and can not create directory.");

        if (params == null)
            params = new HashMap<String, String>();

        DiskFileItemFactory factory = new DiskFileItemFactory();
        upload = new ServletFileUpload(factory);
        uploadFiles = new ArrayList<UploadFile>();

        FileItemIterator iter;

        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            iter = upload.getItemIterator(request);
            while (iter.hasNext()) {
                FileItemStream item = iter.next();
                String paramName = item.getFieldName();
                InputStream stream = item.openStream();
                if (item.isFormField()) {
                    String value = Streams.asString(stream);
                    params.put(paramName, value);
                } else {
                    String originalfileName = item.getName();
                    String uploadedFileName = System.currentTimeMillis()
                            + originalfileName;
                    String contentType = item.getContentType();

                    String filePath = saveDirectory + uploadedFileName;
                    File file = new File(filePath);
                    bis = new BufferedInputStream(stream);
                    bos = new BufferedOutputStream(new FileOutputStream(file));
                    copy(bis, bos);

                    UploadFile uploadFile = new UploadFile(paramName,
                            saveDirectory, uploadedFileName, originalfileName,
                            contentType);
                    if (isSafeFile(uploadFile))
                        uploadFiles.add(uploadFile);
                }
            }
        } catch (FileUploadException | IOException e) {
            e.printStackTrace();
        } catch (SizeLimitExceededException e) {
            this.sizeLimitExceeded = true;
        } finally {
            IOUtil.closeInputStream(bis);
            IOUtil.closeOutStream(bos);
        }
    }

    public void copy(InputStream in, OutputStream out) throws IOException,
            SizeLimitExceededException {
        int contentLength = 0;
        byte[] buf = new byte[8192];
        int len = 0;
        while ((len = in.read(buf)) != -1) {
            out.write(buf, 0, len);
            contentLength += len;
            if (contentLength > MobileValidator.REQUEST_MAX_CONTENT_LENGHT)
                throw new SizeLimitExceededException();
        }
    }

    public boolean isSizeLimitExceeded() {
        return sizeLimitExceeded;
    }

    private boolean isSafeFile(UploadFile uploadFile) {
        if (uploadFile.getFileName().toLowerCase().endsWith(".jsp")) {
            uploadFile.getFile().delete();
            return false;
        }
        return true;
    }

    public List<UploadFile> getFiles() {
        return uploadFiles;
    }

    /**
     * Methods to replace HttpServletRequest methods
     */
    public Enumeration getParameterNames() {
        if (params == null)
            return null;
        return new Enumeration<String>() {
            private Iterator<String> keySetIter = params.keySet().iterator();

            @Override
            public String nextElement() {
                return keySetIter.next();
            }

            @Override
            public boolean hasMoreElements() {
                return keySetIter.hasNext();
            }
        };
    }

    public String getParameter(String name) {
        return params.get(name);
    }

    public String[] getParameterValues(String name) {
        return new String[] { params.get(name) };
    }

    public Map getParameterMap() {
        Map map = new HashMap();
        Enumeration enumm = getParameterNames();
        while (enumm.hasMoreElements()) {
            String name = (String) enumm.nextElement();
            map.put(name, getParameterValues(name));
        }
        return map;
    }
}
 本文由用戶 admin 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!