FileUpload檔案上傳原始碼解析

2021-08-07 01:45:41 字數 2360 閱讀 4744

fileupload是apache commons 用於檔案上傳的元件,實際上就是用來解析http請求,大家都知道,上傳檔案的時候,http的request請求的 content-type 是multipart/form-data,我們就可以用fileupload 來解析http請求,struts,springmvc 等很多mvc框架都是基於fileupload 來實現檔案上傳功能。

2月7日發布了 最新的1.3.1的版本。

大家可以check下來最新的原始碼看下

首先,判斷是否上傳的為檔案

然後獲取檔案的輸入流

拿到流之後我們就可以儲存檔案

以上是其中一種使用方法,如果想將檔案儲存在本地,就可以用使用先生成fileitem,然後再去遍歷items來實現寫檔案

1,其中包括 org.apache.commons.fileupload.servlet.filecleanercleanup  如果上傳檔案用到了disfileitem的話,可以用這個作為***來刪除儲存到磁碟的臨時目錄。同時在建立diskfileitemfactory工廠的時候呼叫如下**,

fileupload有乙個可以用來監聽上傳檔案的過程,主要是用到了 progresslistener這個類

基本實現方式:

fileupload將所有提交的元素(普通form表單域,如text和檔案域file)都看作一樣的fileitem,這樣上傳頁面提交的 request請求也就是乙個fileitem的有序組合,fileupload元件可以解析該request,並返回乙個乙個的fileitem。而對 每乙個fileitem,fileupload元件可以判斷出它是普通form表單域還是檔案file域,從而根據不同的型別,採取不同的操作--如果是 表單域,就讀出其值,如果是檔案域,就儲存檔案到伺服器硬碟上或者記憶體中。

fileupload 主要的核心的類有三個

fileitemfactory:用於建立fileitem,其具體實現是diskfileitemfactory,可以控制檔案儲存在記憶體中還是儲存到臨時磁碟內,改變其預設臨界值。預設是10kb.

servletfileupload   處理表單資料,將資料封裝到 fileitem 物件中。

fileitem  用來封裝http請求的元素以及資料。包含普通引數或者檔案

具體流程圖如下:

下面是對一些主要相關的源**進行解讀。

我們首先看下fileuploadbase的parserequest方法

1.獲取fileitemiterator

2.遍歷fileitemiterator,通過fileitemfactory建立fileitem

3,組裝fileitem

,構造list

其中 iter.next() 會呼叫到 fileuploadbase.findnextitem()方法來封裝fileitem

然後我們看下獲取到item之後的操作

獲取到item之後我們可以遍歷這個items,然後分別呼叫 item的write方法,可以將檔案寫入某個目錄下。

write方法主要分兩步走,如果在記憶體中,就直接獲取,如果在臨時檔案中,則負責乙個新檔案到指定目錄。

使用fileupload元件時需要注意的問題

1,  中文亂碼問題,可以通過 servletuploader的setheaderencoding來制定

2,  設定上傳檔案的最大尺寸,通過servletuploader 的setsizemax方法來指定

3,  合理的設定緩衝區的臨界值,否則會出現outofmemory。

FileUpload 上傳檔案

操作 在頁面內放置乙個fileupload控制項 然後放置上傳的button 或者其他控制項.在 button或者其他控制項的 click 事件中 寫上傳的方法.前台 page language c autoeventwireup true codefile upfile.aspx.cs inher...

使用FileUpload上傳檔案

下面是fileupload上傳的基本步驟 1 建立磁碟工廠 diskfileitemfactory factory new diskfileitemfactory 2 建立處理工具 servletfileupload upload new servletfileupload factory 3 設定...

Fileupload實現檔案上傳

在實際開發中,經常會遇到包含檔案上傳的表單,採用fileupload可以處理這種表單。需要的jar包為commons fileupload.jar和commons io.jar.需要注意的是,表單的enctype屬性必須設定為multipart form data,method屬性為必須為post....