1. 程式人生 > >檔案上傳的fileupload 元件

檔案上傳的fileupload 元件

(2)通過修改伺服器端程式碼。前提是利用jar包。
commons-fileupload-1.2.2.jar和commons-io-1.4.jar
//建立工廠
DiskFileItemFactory factoy=new DiskFileItemFactory();
//factory工廠類, 可以設定上傳檔案的大小!
//建立解析器
ServletFileUpload sfu=new ServletFileUpload(factoy);
sfu.setSizeMax(int size) //設定檔案總的大小, 也可以setFileSizeMax設定單個檔案的大小
//解析request
try {
List list=sfu.parseRequest(request);
for (FileItem fileItem : list) {
if(fileItem.isFormField()){
//FileItem型別的物件裡有一個方法isFormField(),
//可以判斷表單項是表單域還是檔案域
String name = fileItem.getFildName();
String value = fileItem.getString();
//表單域拿到鍵值對
}else{
//否則是檔案域,就取得檔案的資訊和檔案的流
String fieldname = fileItem.getFildName();
String filename = fileItem.getName();
String contentType = fileItem.getContentType();

}
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

DiskFileItemFactory類的常用方法:

構造方法

  1. public DiskFileItemFactory()

  2. public DiskFileItemFactory(int sizeThreshold,File repository)

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

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

  1. void setRepository(File repository)
    setRepositoryPath方法用於設定當上傳檔案尺寸大於setSizeThreshold方法設定的臨界值時,將檔案以臨時檔案形式儲存在磁碟上的存放目錄。有一個對應的獲得臨時資料夾的 File getRespository() 方法。

注意:當從沒有呼叫此方法設定臨時檔案儲存目錄時,預設採用系統預設的臨時檔案路徑,可以通過系統屬性 java.io.tmpdir 獲取。如下程式碼:

System.getProperty(“java.io.tmpdir”);

Tomcat系統預設臨時目錄為“<tomcat安裝目錄>/temp/”。

FileItem類的常用方法:

  1. boolean isFormField()
    isFormField方法用於判斷FileItem類物件封裝的資料是一個普通文字表單欄位,還是一個檔案表單欄位,如果是普通表單欄位則返回true,否則返回false。因此,可以使用該方法判斷是否為普通表單域,還是檔案上傳表單域。

  2. String getName()
    getName方法用於獲得檔案上傳欄位中的檔名。
    注意IE或FireFox中獲取的檔名是不一樣的,IE中是絕對路徑,FireFox中只是檔名。

  3. String getFieldName()
    getFieldName方法用於返回表單標籤name屬性的值。如上例中的value。

  4. void write(File file)
    write方法用於將FileItem物件中儲存的主體內容儲存到某個指定的檔案中。如果FileItem物件中的主體內容是儲存在某個臨時檔案中,該方法順利完成後,臨時檔案有可能會被清除。該方法也可將普通表單欄位內容寫入到一個檔案中,但它主要用途是將上傳的檔案內容儲存在本地檔案系統中。

  5. String getString()
    getString方法用於將FileItem物件中儲存的資料流內容以一個字串返回,它有兩個過載的定義形式:
    public java.lang.String getString()
    public java.lang.String getString(java.lang.String encoding)
    throws java.io.UnsupportedEncodingException
    前者使用預設的字符集編碼將主體內容轉換成字串,後者使用引數指定的字符集編碼將主體內容轉換成字串。如果在讀取普通表單欄位元素的內容時出現了中文亂碼現象,請呼叫第二個getString方法,併為之傳遞正確的字符集編碼名稱。

  6. String getContentType()
    getContentType 方法用於獲得上傳檔案的型別,即表單欄位元素描述頭屬性“Content-Type”的值,如“image/jpeg”。如果FileItem類物件對應的是普通表單欄位,該方法將返回null。

  7. boolean isInMemory()
    isInMemory方法用來判斷FileItem物件封裝的資料內容是儲存在記憶體中,還是儲存在臨時檔案中,如果儲存在記憶體中則返回true,否則返回false。

  8. void delete()
    delete方法用來清空FileItem類物件中存放的主體內容,如果主體內容被儲存在臨時檔案中,delete方法將刪除該臨時檔案。
    儘管當FileItem物件被垃圾收集器收集時會自動清除臨時檔案,但及時呼叫delete方法可以更早的清除臨時檔案,釋放系統儲存資源。另外,當系統出現異常時,仍有可能造成有的臨時檔案被永久儲存在了硬碟中。

  9. InputStream getInputStream()
    以流的形式返回上傳檔案的資料內容。

  10. long getSize()
    返回該上傳檔案的大小(以位元組為單位)。

寫一個helloUploadFile簡單例子來看看! 在資料中有java程式碼檔案

上傳檔案前應該想到是注意項:
/**

  • 1、為保證伺服器安全,上傳檔案應該放在外界無法直接訪問的目錄下,比如放於WEB-INF目錄下。
  • 2、為防止檔案覆蓋的現象發生,要為上傳檔案產生一個唯一的檔名。
  • 3、為防止一個目錄下面出現太多檔案,要使用hash演算法打散儲存。
  • 4、要限制上傳檔案的最大值。
  • 5、要限制上傳檔案的型別,在收到上傳檔名時,判斷後綴名是否合法。
    */

基本思路:
①獲取和建立儲存檔案的最終目錄和臨時目錄
②建立一個DiskFileItemFactory工廠
③建立一個檔案上傳解析器
④判斷提交上來的資料是否是上傳表單的資料,是不是Multipart編碼方式ServletFileUpload.isMultipartContent(request)
⑤使用ServletFileUpload解析器解析上傳資料,解析結果返回的是一個List集合
⑥判斷普通域還是檔案域
⑦將普通表單域的鍵值對顯示出來
⑧驗證字尾的合法性
⑨將檔案流寫入儲存的目錄中(生成新的檔名,避免一個目錄中檔案太多而生成新的儲存目錄)

轉載地址