1. 程式人生 > >commons-fileupload實現檔案上傳

commons-fileupload實現檔案上傳

一、準備需要上傳的檔案

上傳檔案的準備就不用多說了,先準備一個jsp頁面。此頁面中有一個form表單,此表單有如下三個特徵。

a、表單的method必須是post
b、表單的enctype屬性值必須是multipart/form-data
c、表單中提供<input type="file"/>

二、開始上傳

我們需要建立一個servlet,在此servlet中準備上傳所需要的類,也就是DiskFileItemFactory類和ServletFileUpload類;DiskFileitemFactory類負責管理磁碟檔案,ServletFileUpload類負責上傳和解析檔案,如下是具體程式碼實現

@Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        //處理中文亂碼問題
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        //檢查請求是否是multipart/form-data型別
        if
(!ServletFileUpload.isMultipartContent(req)){ //不是multipart/form-data型別 throw new RuntimeException("表單的enctype屬性不是multipart/form-data型別!!"); } //建立上傳所需要的兩個物件 DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload sfu = new ServletFileUpload(factory); //解析器依賴於工廠
//建立容器來接受解析的內容 List<FileItem> items = new ArrayList<FileItem>(); //將上傳的檔案資訊放入容器中 try { items = sfu.parseRequest(req); } catch (FileUploadException e) { e.printStackTrace(); } //遍歷容器,處理解析的內容;封裝兩個方法,一個處理普通表單域,一個處理檔案的表單域 for(FileItem item : items){ if(item.isFormField()){ handleFormField(item); }else{ handleUploadField(item); } } }

三、解析上傳檔案並儲存到伺服器

下面是兩個需要解析的方法,一個是專門處理普通表單域的,一個是專門處理檔案表單域的

/**
     * 處理普通表單域
     * @param item
     */
    private void handleFormField(FileItem item) {
        String fieldName = item.getFieldName(); //得到表單域的name的值
        String value = "";
        try {
            value = item.getString("utf-8");  //得到普通表單域中所輸入的值
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        //列印到控制檯
        System.out.println("fieldName:"+fieldName+"--value:"+value);
    }
/**
     * 處理檔案的表單域
     * @param item
     */
    private void handleUploadField(FileItem item) {
        String fileName = item.getName();  //得到上傳檔案的檔名
        if(fileName!=null && !"".equals(fileName)){
            //控制只能上傳圖片
            if(!item.getContentType().startsWith("image")){
                return;
            }

            //向控制檯列印檔案資訊
            System.out.println("fileName:"+fileName);
            System.out.println("fileSize:"+item.getSize());
        }

        //上傳檔案儲存路徑
        String path = this.getServletContext().getRealPath("/files");
        //建立子目錄
        File childDirectory = getChildDirectory(path);

        //寫入伺服器或者磁碟
        try {
            item.write(new File(childDirectory.toString(),UUID.randomUUID()+"_"+fileName));
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

為了防止上傳的檔案都是在同一個目錄下,對於以後的遍歷查詢十分的不便,所以為上傳的檔案建立子目錄

/**
     * 按照時間建立子目錄,防止一個目錄中檔案過多,不利於以後遍歷查詢
     * @param path
     * @return
     */
    private File getChildDirectory(String path) {
        Date currTime = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String time = sdf.format(currTime);

        File file = new File(path,time);
        if(!file.exists()){
            file.mkdirs();
        }
        return file;
    }

四、檔案上傳時的一個限制要求

一、限制檔案的型別,如,只能上傳圖片

//控制只能上傳圖片
            if(!item.getContentType().startsWith("image")){
                return;
            }

二、限制上傳檔案的大小

//建立上傳所需要的兩個物件
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload sfu = new ServletFileUpload(factory); //解析器依賴於工廠

        //限制單個檔案的大小
        sfu.setFileSizeMax(1024*10);
        //限制上傳的總檔案大小
        sfu.setSizeMax(1024*200);

        //建立容器來接受解析的內容
        List<FileItem> items = new ArrayList<FileItem>();

        //將上傳的檔案資訊放入容器中
        try {
            items = sfu.parseRequest(req);
        }catch(FileUploadBase.FileSizeLimitExceededException e){
            resp.getWriter().write("檔案大小不能超過10kb");
        }catch (FileUploadException e) {
            e.printStackTrace();
        }

五、其他的一些配置

DiskFileItemFactory有兩個方法:setSizeThreshold和setRepository

1、 setRepository方法用於設定當上傳檔案尺寸大於setSizeThreshold方法設定的臨界值時,將檔案以臨時檔案形式儲存在磁碟上的存放目錄。有一個對應的獲得臨時資料夾的 File getRespository() 方法。
注意:當從沒有呼叫此方法設定臨時檔案儲存目錄時,預設採用系統預設的臨時檔案路徑,可以通過系統屬性 java.io.tmpdir 獲取。如下程式碼:
System.getProperty(“java.io.tmpdir”);
Tomcat系統預設臨時目錄為“<tomcat安裝目錄>/temp/”


2、setSizeThreshold方法用於設定是否將上傳檔案已臨時檔案的形式儲存在磁碟的臨界值(以位元組為單位的int值),如果從沒有呼叫該方法設定此臨界值,將會採用系統預設值10KB。對應的getSizeThreshold() 方法用來獲取此臨界值。


附:Apache檔案上傳元件在解析上傳資料中的每個欄位內容時,需要臨時儲存解析出的資料,以便在後面進行資料的進一步處理(儲存在磁碟特定位置或插入資料庫)。因為Java虛擬機器預設可以使用的記憶體空間是有限的,超出限制時將會丟擲“java.lang.OutOfMemoryError”錯誤。如果上傳的檔案很大,例如800M的檔案,在記憶體中將無法臨時儲存該檔案內容,Apache檔案上傳元件轉而採用臨時檔案來儲存這些資料;但如果上傳的檔案很小,例如600個位元組的檔案,顯然將其直接儲存在記憶體中效能會更加好些。

相關推薦

Apache Commons FileUpload實現檔案

Commons FileUpload簡介 Apache Commons是一個專注於可重用Java元件開發的 Apache 專案。Apache Commons專案由三個部分組成: 1、Commons Proper - 可重用Java元件的儲存庫。 2、The Commons Sandbox - 用於Jav

commons-fileupload實現檔案

一、準備需要上傳的檔案 上傳檔案的準備就不用多說了,先準備一個jsp頁面。此頁面中有一個form表單,此表單有如下三個特徵。 a、表單的method必須是post b、表單的enctyp

commons-fileupload實現檔案

Form表單的要求 1.提供from表單,method必須是post(post方式可以提交大量資料) 2.提供input type=”file”標籤 3.form表單的enctype屬性必須是multipart/form-data(就是在設定請求訊息頭的C

commons-fileupload實現檔案、下載、線上開啟

最近做了一個檔案上傳、下載、與線上開啟檔案的功能,剛開始對檔案上傳的介面中含有其它表單(例如輸入框、密碼等)在上傳的過程中遇到了許多問題,下面我寫了一個同時實現檔案上傳、下載、線上開啟檔案的測試程式。 首先請看效果圖: 核心程式碼:

利用 Commons-Fileupload 實現檔案

Apache FileUpload檔案上傳元件API解析(轉) Java Web開發人員可以使用Apache檔案上傳元件來接收瀏覽器上傳的檔案,該元件由多個類共同組成,但是,對於使用該元件來編寫檔案上傳功能的Java Web開發人員來說,只需要瞭解和使用其中的三個類:DiskFileUpload、FileIt

SpringMVC 通過commons-fileupload實現檔案

[TOC](目錄) # 配置 ## web.xml ```xml ``` ## SpringMVC配置檔案 applicationContext.xml 上傳檔案的核心配置類:CommonsMultipartResolver,注意`id="multipartResolver"`不要寫錯 ```

Java架構-Spring mvc+oss儲存+fileupload檔案實現SSO單點登入模板管理

之前給大家介紹了sso的相關知識點和整合方案,考慮到每個系統所屬行業的不同,這邊針對於不同行業做了一些統一的sso單點登入介面模板,使用fileupload多檔案上傳+OSS阿里雲端儲存方案。 1. 阿里雲oss儲存Utils Java程式碼 2. 阿里雲配

框架中如何根據fileupload工具包實現檔案功能

工具包 Apache-fileupload.jar – 檔案上傳核心包。 Apache-commons-io.jar – 這個包是fileupload的依賴包。同時又是一個工具包。 程式碼  servletFileUpload官方API /*獲取tomcat的wor

檔案控制元件Fileupload實現檔案並寫入資料庫)

首先我們來說一下Fileupload這個檔案上傳控制元件的幾大敗筆: 1.上傳之後按F5重新整理,重複提交 2.提交以後按後退鍵Fileupload中的資訊還在 3.不支援多檔案上傳 4.上傳前不能檢測檔案大小 解決方法: 1.建立iframe在子頁面實現或者重定向語句(R

common-fileUpload和 Spring中MultipartHttpServletRequest實現檔案、以及過濾器的問題

遇到一個專案中寫的過濾器有些不明白為什麼那麼寫,其實就是以下的第二部分不理解造成的 二、 使用servlet時:多部件表單上傳對servlet取值問題 1)  request.getParameter("..."),這個方法在表單為multiparty/form-d

commons.fileupload 文件

session val sta ava 工廠 ota data 自定義 this 編輯jsp頁面獲取文件 1 <html> 2 <head> 3 <base href="<%=basePath%>"> 4

struts2實現檔案與下載功能

一、Demo介紹 基於struts2框架,實現多檔案的上傳和下載功能。 實現原理圖: 部分介面圖: 上傳成功及下載頁面: 二、主要程式碼 uploadFile.jsp:在form表單中包含一個文字框(上傳使用者的姓名)和兩個檔案上傳選項. <%@

Java Springboot結合FastDFS實現檔案以及根據圖片url將圖片至圖片伺服器

上一篇文章我們已經講解了如何搭建FastDFS圖片伺服器,環境我們準備好了現在就讓我們開始與Java結合將他應用到實際的專案中吧。本篇文章我們將會展示上傳圖片到FastDFS圖片伺服器以及通過外網的圖片url將圖片上傳至我們自己的圖片伺服器中。 1.建立springbo

yii框架實現檔案

yii框架實現檔案上傳 1.首先yii框架下載uploadFile類 2.html程式碼 <input type="file" class="file" style="display: none" name="business_license" /> 3.j

原生javascript實現檔案功能程式碼

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ini

【SSH網上商城專案實戰13】Struts2實現檔案功能

  轉自:https://blog.csdn.net/eson_15/article/details/51366384 上一節我們做完了新增和更新商品的功能,這兩個部分裡有涉及到商品圖片的上傳,並沒有詳細解說。為此,這篇文章詳細介紹一下Struts2實現檔案上傳的功能。 1

關於myeclipse實現檔案與使用的路徑問題

在檔案上傳的時候編寫檔案儲存應該儲存到 myeclipse 的workspace的工程目錄下面,而不是放到tomcat的webapps下面。否則eclipse 無法更新檔案。 換句話講,在eclipse中新增檔案,comcat的專案檔案中可以看見新增的文體,但是反過來,在comcat的工程目錄下

servlet3.0實現檔案

servlet3.0實現檔案上傳功能 必須使用tomcat7以上的技術才能支援servlet3.0 servlet3.0 比 servlet2.5 多提供了三個新特性:   註解開發:方便   檔案上傳:有些api不是特別全   非同步請求:基本不用,使用ajax替代 檔案上傳技術: 1

Extjs+C# 實現檔案

Extjs 程式碼 var ImportPanel = new Ext.form.FormPanel({ baseCls: 'x-plain', frame: false,    // 注意formPanel裡面的fileUpload一定要開啟