File,DiskFileItemFactory,ServletFileUpload,File...

  將請求消息實體中的每個項目封裝成單獨的DiskFileItem (FileItem接口的實現) 對象的任務
由 org.apache.commons.fileupload.FileItemFactory 接口的默認實現
org.apache.commons.fileupload.disk.DiskFileItemFactory 來完成。當上傳的文件項目比較小時,直接保存在內存中(速度比較快),比較大時,以臨時文件的形式,保存在磁盤臨時文件夾(雖然速度慢些,可是內存資源是有限的)。html

屬性
1) public static final int DEFAULT_SIZE_THRESHOLD :將文件保存在內存仍是磁盤臨時文件夾的默認臨界值,值爲10240,即10kb。
java

2) private File repository:用於配置在建立文件項目時,當文件項目大於臨界值時使用的臨時文件夾,默認採用系統默認的臨時文件路徑,能夠經過系統屬性 java.io.tmpdir獲取。以下代碼: web

System.getProperty("java.io.tmpdir"); 數據庫

3) private int sizeThreshold:用於保存將文件保存在內存仍是磁盤臨時文件夾的臨界值 apache

構造方法
1) public DiskFileItemFactory()
緩存

      採用默認臨界值和系統臨時文件夾構造文件項工廠對象。 tomcat

2) public DiskFileItemFactory(int sizeThreshold,File repository) 網絡

      採用參數指定臨界值和系統臨時文件夾構造文件項工廠對象。 jsp

3) FileItem createItem()
       根據DiskFileItemFactory相關配置將每個請求消息實體項目建立成DiskFileItem 實例,並返回。該方法歷來不須要咱們親自調用,FileUpload組件在解析請求時內部使用。
post

4) void setSizeThreshold(int sizeThreshold)
        Apache文件上傳組件在解析上傳數據中的每一個字段內容時,須要臨時保存解析出的數據,以便在後面進行數據的進一步處理(保存在磁盤特定位置或插入數據庫)。由於Java虛擬機默承認以使用的內存空間是有限的,超出限制時將會拋出「java.lang.OutOfMemoryError」錯誤。若是上傳的文件很大,例如800M的文件,在內存中將沒法臨時保存該文件內容,Apache文件上傳組件轉而採用臨時文件來保存這些數據;但若是上傳的文件很小,例如600個字節的文件,顯然將其直接保存在內存中性能會更加好些。

        setSizeThreshold方法用於設置是否將上傳文件已臨時文件的形式保存在磁盤的臨界值(以字節爲單位的int值),若是從沒有調用該方法設置此臨界值,將會採用系統默認值10KB。對應的getSizeThreshold() 方法用來獲取此臨界值。

5) void setRepository(File repository)
        setRepositoryPath方法用於設置當上傳文件尺寸大於setSizeThreshold方法設置的臨界值時,將文件以臨時文件形式保存在磁盤上的存放目錄。有一個對應的得到臨時文件夾的 File getRespository() 方法。

         注意:當從沒有調用此方法設置臨時文件存儲目錄時,默認採用系統默認的臨時文件路徑,能夠經過系統屬性 java.io.tmpdir 獲取。以下代碼:

System.getProperty("java.io.tmpdir");

Tomcat系統默認臨時目錄爲「<tomcat安裝目錄>/temp/」。


使用common-fileUpload製做文件上傳(DiskFileItemFactory方式)  

所需包:commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar

在網絡找了關於JSP上傳文件問題,原本想作個利用AJAX作帶進度條的文件上傳功能,可是網絡上的文章都比較複雜,看了半天都看不懂,發現本身連最簡單的文件上傳都沒有作過,那個就暫時算了,老實點從簡單的先作起再研究那個帶進度條的文件上傳。
       在網絡上找了下jsp上傳文件的代碼,有不少,可是多數人寫的不清楚,不過找了一個稍微清楚點的文章,文章地址給忘了(,真對不起人家,作人還不夠厚道)。下面基本原封不動的把代碼貼上來,以備後用。
首先下載:commons-fileUpload-1.2 的jar包:http://www.apache.org/commons/,同時能夠把commons-IO的jar包一塊兒下載,之後會用到的。
一、上傳的前臺頁面:
<%@ page language="java" import="java.util.*" contentType="text/html;charset=gbk" pageEncoding="gbk"%>
<html>
<body>
    <form action="MultipartTestServlet" enctype="multipart/form-data" method="post">
     <input type="text" name="username" /><br />
     <input type="file" name="myfile" /><br/>
     <input type="file" name="myfile" /><br/>
     <input type="submit" />
    </form>
</body>
</html>
二、上傳的後臺代碼:
       後臺代碼是個servlet,很簡單咯,以爲比ASP利用組件還簡單。呵呵
package upload;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.RequestContext;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.servlet.ServletRequestContext;
public class MultipartTestServlet extends HttpServlet {
public MultipartTestServlet() {
super();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
//設置request編碼,主要是爲了處理普通輸入框中的中文問題
request.setCharacterEncoding("gbk");
//這裏對request進行封裝,RequestContext提供了對request多個訪問方法
RequestContext requestContext = new ServletRequestContext(request);
//判斷表單是不是Multipart類型的。這裏能夠直接對request進行判斷,不過已經之前的用法了
if(FileUpload.isMultipartContent(requestContext)){
   DiskFileItemFactory factory = new DiskFileItemFactory();
   //設置文件的緩存路徑
   factory.setRepository(new File("c:/tmp/"));
   ServletFileUpload upload = new ServletFileUpload(factory);
   //設置上傳文件大小的上限,-1表示無上限 
   upload.setSizeMax(100*1024*1024);
   List items = new ArrayList();
    try {
        //上傳文件,並解析出全部的表單字段,包括普通字段和文件字段
     items = upload.parseRequest(request);
    } catch (FileUploadException e1) {
     System.out.println("文件上傳發生錯誤" + e1.getMessage());
    }
     //下面對每一個字段進行處理,分普通字段和文件字段
   Iterator it = items.iterator();
   while(it.hasNext()){
    FileItem fileItem = (FileItem) it.next();
    //若是是普通字段
    if(fileItem.isFormField()){   
     System.out.println(fileItem.getFieldName() + "   " + fileItem.getName() + "   " + new String(fileItem.getString().getBytes("iso8859-1"), "gbk"));
    }else{
     System.out.println(fileItem.getFieldName() + "   " +
        fileItem.getName() + "   " +
        fileItem.isInMemory() + "    " +
        fileItem.getContentType() + "   " +
        fileItem.getSize());
     //保存文件,其實就是把緩存裏的數據寫到目標路徑下
     if(fileItem.getName()!=null && fileItem.getSize()!=0){
      File fullFile = new File(fileItem.getName());
      File newFile = new File("c:/temp/" + fullFile.getName());
      try {
       fileItem.write(newFile);
      } catch (Exception e) {
       e.printStackTrace();
      }
     }else{
      System.out.println("文件沒有選擇 或 文件內容爲空");
     }
    }
   }
}
}
}
三、編譯和配置servlet        先設置classpath,使它包含commons-fileUpload的jar包路徑,而後進行編譯便可,注意這裏的包路徑。        而後打開站點下的web-inf路徑下的web.xml,在裏面添加: <servlet>       <servlet-name>MultipartTestServlet</servlet-name>       <servlet-class>upload.MultipartTestServlet</servlet-class> </servlet>      <servlet>       <servlet-name>dispatcher</servlet-name>       <servlet-class>helloApp.DispatcherServlet</servlet-class> </servlet> 好了,如今就能夠文件上傳了,不過運行以前記得在c:\下新建tmp和temp文件夾,別忘了,否則程序會報告錯誤的

相關文章
相關標籤/搜索