利用DiskFileItemFactory實現文件上傳


<%@ page contentType="text/html;charset=UTF-8" %>
<HTML>
<HEAD>
    <title>上傳文件</title>
</HEAD>
   <body>
     <div>
         <form action="upFile.do" method="post" enctype="multipart/form-data">
             <table>
                 <tr>
                     <td>姓名</td>
                     <td><input name="name" type="text"></td>
                     <td>年齡</td>
                     <td><input name="age" type="text"></td>
                     <td>上傳文件</td>
                     <td><input name="file" type="file"></td>
                     <td><input type="submit" value="上傳"></td>
                 </tr>
             </table>
         </form>
     </div>
   </body>
</HTML>

  

核心API—DiskFileItemFactory
DiskFileItemFactory 是創建FileItem 對象的工廠,這個工廠類常用方法:
1、public void setSizeThreshold(int sizeThreshold) :設置內存緩沖區的大小,默認值為10K。當上傳文件大於緩沖區大小時,fileupload組件將使用臨時文件緩存上傳文件。
2、public void setRepository(Java.io.File repository) :指定臨時文件目錄,默認值為System.getProperty(“java.io.tmpdir”).
3、public DiskFileItemFactory(int sizeThreshold,java.io.File repository) :構造函數

核心API—-ServletFileUpload
ServletFileUpload 負責處理上傳的文件數據,並將表單中每個輸入項封裝成一個FileItem 對象中。常用方法有:
1、boolean isMultipartContent(HttpServletRequest request) :判斷上傳表單是否為multipart/form-data類型

2、List parseRequest(HttpServletRequest request):解析request對象,並把表單中的每一個輸入項包裝成一個fileItem 對象,並返回一個保存了所有FileItem的list集合。

3、setFileSizeMax(long fileSizeMax) :設置上傳文件的最大值(單個文件),用於設置單個上傳文件的最大尺寸限制,以防止客戶端惡意上傳超大文件來浪費服務器端的存儲空間。其參數是以字節為單位的long型數字。

4、setSizeMax(long sizeMax) :設置上傳文件總量的最大值(所有上傳文件),用於設置請求消息實體內容(即所有上傳數據)的最大尺寸限制,以防止客戶端惡意上傳超大文件來浪費服務器端的存儲空間。其參數是以字節為單位的long型數字。

5、setHeaderEncoding(java.lang.String encoding) :設置編碼格式。在文件上傳請求的消息體中,除了普通表單域的值是文本內容以外,文件上傳字段中的文件路徑名也是文本,在內存中保存的是它們的某種字符集編碼的字節數組,Apache文件上傳組件在讀取這些內容時,必須知道它們所采用的字符集編碼,才能將它們轉換成正確的字符文本返回。

核心API—FileItem
FileItem類的常用方法:
1、boolean isFormField(): isFormField方法用於判斷FileItem類對象封裝的數據是一個普通文本表單字段,還是一個文件表單字段,如果是普通表單字段則返回true,否則返回false。

2、 String getName()
用於獲得文件上傳字段中的文件名。注意IE或FireFox中獲取的文件名是不一樣的,IE中是絕對路徑,FireFox中只是文件名。

3、String getFieldName()
用於返回表單標簽name屬性的值。

4、 void write(File file):用於將FileItem對象中保存的主體內容保存到某個指定的文件中。如果FileItem對象中的主體內容是保存在某個臨時文件中,該方法順利完成后,臨時文件有可能會被清除。該方法也可將普通表單字段內容寫入到一個文件中,但它主要用途是將上傳的文件內容保存在本地文件系統中。

5、 String getString():用於將FileItem對象中保存的數據流內容以一個字符串返回,它有兩個重載的定義形式:
public Java.lang.String getString();
public java.lang.String getString(java.lang.String encoding) throws java.io.UnsupportedEncodingException
前者使用缺省的字符集編碼將主體內容轉換成字符串,后者使用參數指定的字符集編碼將主體內容轉換成字符串。如果在讀取普通表單字段元素的內容時出現了中文亂碼現象,請調用第二個getString方法,並為之傳遞正確的字符集編碼名稱。

6、 void delete():delete方法用來清空FileItem類對象中存放的主體內容,如果主體內容被保存在臨時文件中,delete方法將刪除該臨時文件。盡管當FileItem對象被垃圾收集器收集時會自動清除臨時文件,但及時調用delete方法可以更早的清除臨時文件,釋放系統存儲資源。

實現步驟:
1、創建DiskFileItemFactory對象,設置緩沖區大小和臨時文件目錄。
2、使用DiskFileItemFactory 對象創建ServletFileUpload對象,並設置上傳文件的大小限制。
3、調用ServletFileUpload.parseRequest方法解析request對象,得到一個保存了所有上傳內容的List對象。
4、對list進行迭代,每迭代一個FileItem對象,調用其isFormField方法判斷是否是上傳文件:
4.1、 為普通表單字段,則調用getFieldName、getString方法得到字段名和字段值。
4.2、為上傳文件,則調用getInputStream方法得到數據輸入流,從而讀取上傳數據。
需要引入的jar包:

<dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.4</version>
    </dependency>

  代碼實現:

public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException,IOException{

        response.setContentType("text/html;charset=UTF-8");

        //創建一個解析器工廠
        DiskFileItemFactory factory=new DiskFileItemFactory();
        //設置工廠的內存緩沖區大小,默認是10K
       // factory.setSizeThreshold(1024*1024);
        //設置工廠的臨時文件目錄:當上傳文件的大小大於緩沖區大小時,將使用臨時文件目錄緩存上傳的文件
        factory.setRepository(new File("D:\\YOHO\\"));
       //文件上傳解析器
        ServletFileUpload upload=new ServletFileUpload(factory);
       //設置所有上傳數據的最大值,單位字節long  1M
        upload.setSizeMax(1024*1024);
        //設置單個文件上傳的最大值
        upload.setFileSizeMax(1024*1024);
        //設置編碼格式
        upload.setHeaderEncoding("UTF-8");

        try {
            //解析請求,將表單中每個輸入項封裝成一個FileItem對象
            List<FileItem> itemList=upload.parseRequest(request);
            for(FileItem item:itemList){
                //判斷輸入的類型是 普通輸入項 還是文件
                if(item.isFormField()){
                    //普通輸入項 ,得到input中的name屬性的值
                    String name=item.getFieldName();
                    //得到輸入項中的值
                    String value=item.getString("UTF-8");
                    System.out.println("name="+name+"  value="+value);
                }else{
                    //上傳的是文件,獲得文件上傳字段中的文件名
                    //注意IE或FireFox中獲取的文件名是不一樣的,IE中是絕對路徑,FireFox中只是文件名。
                    String fileName=item.getName();
                    System.out.println(fileName);
                    //返回表單標簽name屬性的值
                    String namede=item.getFieldName();
                    System.out.println(namede);

                   //方法一:保存上傳文件到指定的文件路徑
                    InputStream is=item.getInputStream();
                    FileOutputStream fos=new FileOutputStream("D:\\wps\\"+fileName);
                    byte[] buff=new byte[1024];
                    int len=0;
                    while((len=is.read(buff))>0){
                        fos.write(buff);
                    }

                    //方法二:保存到指定的路徑
                    //將FileItem對象中保存的主體內容保存到某個指定的文件中。
                    // 如果FileItem對象中的主體內容是保存在某個臨時文件中,該方法順利完成后,臨時文件有可能會被清除
                    item.write(new File("D:\\sohucache\\"+fileName));
                    is.close();
                    fos.close();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
//結果:
//普通文本
name=name  value=我等着
name=age  value=25
//文件名 :火狐瀏覽器是 文件名,,IE瀏覽器是絕對路徑
asosResult.txt
//jsp中name屬性的值
file

原文:https://blog.csdn.net/u014785687/article/details/73863964 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM