Java使用Commons-FileUpload組件實現檔案上傳最佳方案

來源:互聯網
上載者:User

標籤:ann   nbsp   serve   use   NPU   應用程式   內容類型   sub   mooc   

學習的目標使用commons-fileupload實現檔案上傳使用commons-fileupload封裝檔案上傳工具類  什麼是commons-fileupload?The CommonsFileUploadpackage makes it easy to add robust, high-performance, file upload capability to your servlets and web applications.FileUpload parses HTTP requests which conform toRFC 1867, "Form-based File Upload in HTML". That is, if an HTTP request is submitted using the POST method, and with a content type of "multipart/form-data", then FileUpload can parse that request, and make the results available in a manner easily used by the caller. FileUpload包可以很容易地添加強大的,高效能,檔案上傳到你的Servlet的Web應用程式的能力。FileUpload解析HTTP請求符合RFC 1867年,“在HTML的檔案上傳。就是說,如果一個HTTP請求是使用POST方法提交,並與一個內容類型“multipart/form-data”,然後FileUpload可以解析這個請求,並把結果提供一個容易使用的調用方式。  為什麼要使用commons-fileupload在使用傳統的Servlet上傳的時候我們可以使用req.getInputStream()來擷取檔案上傳的流,我們在擷取到這個流之後需要手動的針對這個流進行特殊處理進行去流中不必要的開始和結束內容,才能真正的擷取到流的內容,本章節並不對原始Servlet的上傳進行探究,我們另開章節針對原始Servelt上傳進行探究。  使用commons-fileupload的要求
  1. method方法必須是POST,不能是GET
  2. 新加一個屬性enctype,值為”multipart/form-data”
  3. 檔案表單項<input>的類型為file,即type=”file”
  使用commons-fileupload核心步驟解讀第一步:判斷是否可以進行檔案上傳第二步:建立一個FileItem工廠,通過工廠建立檔案上傳核心組件ServletFileUpload對象第三步:通過核心上傳組件解析request請求,擷取表單的所有表單項,表單的每一個表單項對應一個FileItem 第四步:遍曆所有的表單項,判斷是否是普通的表單項,如果不是就是檔案上傳,就可以針對遍曆的這個fileItem進行一系列的操作 封裝一個工具類,讓我們在處理檔案上傳的時候爽呀爽在上面我們已經介紹過了使用commons-fileupload上傳檔案的整個流程,所以我們就直接將這個流程封裝成一個工具類,在使用到檔案上傳的Servlet中直接使用,十分便利第一步:建立一個DTO(用於儲存commons-fileupload解析請求的結果) 
import org.apache.commons.fileupload.FileItem; import java.util.HashMap;import java.util.Map; public class ParamDto {     private Map<String,String> paramMap;    private Map<String,FileItem> fileMap;     public ParamDto() {        paramMap = new HashMap<>();        fileMap = new HashMap<>();    }     public Map<String, String> getParamMap() {        return paramMap;    }     public void setParamMap(Map<String, String> paramMap) {        this.paramMap = paramMap;    }     public Map<String, FileItem> getFileMap() {        return fileMap;    }     public void setFileMap(Map<String, FileItem> fileMap) {        this.fileMap = fileMap;    }}

 

第二步:將commons-fileupload解析檔案的整個請求,封裝成一個工具類
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;import org.imooc.dto.ParamDto; import javax.servlet.http.HttpServletRequest;import java.io.File;import java.util.List; public class RequestUtil {     /**     * 從request流中解析參數與上傳的檔案     * @param request     */    public static ParamDto parseParam(HttpServletRequest request) {         ParamDto result = new ParamDto(); //建立一個FileItem工廠 通過DiskFileItemFactory對象建立檔案上傳核心組件        ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());        upload.setHeaderEncoding("UTF-8");         try {//通過檔案上傳核心組件解析request請求,擷取到所有的FileItem對象            List<FileItem> fileItemList = upload.parseRequest(request); //遍曆表單的所有表單項(FileItem) 並對其進行相關操作            for(FileItem fileItem : fileItemList) {//判斷這個表單項如果是一個普通的表單項                if(fileItem.isFormField()) {                    result.getParamMap().put(fileItem.getFieldName(),fileItem.getString("UTF-8"));//如果不是表單的普通文本域,就是                } else {                    result.getFileMap().put(fileItem.getFieldName(),fileItem);                }            }        } catch (FileUploadException e) {            e.printStackTrace();        } catch (Exception e) {            e.printStackTrace();        }        return result;    }}

 

第三步:讓我們直接在Servlet中使用這個工具類吧,哈哈 另:我們當然可以封裝一個儲存檔案(Item)的一個通用方法
import org.apache.commons.fileupload.FileItem; import java.io.File; public class FileUtil {     /**     * 上傳檔案的儲存路徑     */    public static final String SAVE_PATH = "d:/upload/";     /**     * 儲存上傳的檔案     * @param fileItem     * @param path     * @return     * @throws Exception     */    public static String save(FileItem fileItem,String path) throws Exception {        String fileName = System.currentTimeMillis() + "_" + fileItem.getName();        fileItem.write(new File(path + fileName));        return fileName;    }}

 

好啦~ 有空我們再來看看原始的檔案上傳方式

 

Java使用Commons-FileUpload組件實現檔案上傳最佳方案

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.