<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-7  評(píng)論-24  文章-102  trackbacks-0

     

    一、準(zhǔn)備:

    1、 下載 commons-fileupload 庫(kù),下載地址:http://commons.apache.org/fileupload/
    2、 下載 commons-fileupload 依賴庫(kù) commons-io,下載地址:http://commons.apache.org/io/

    推薦文章:
    1、利用MultipartFile實(shí)現(xiàn)文件上傳
    2、利用Jakarta commons fileupload組件實(shí)現(xiàn)多文件上傳
        使用commons-fileupload實(shí)現(xiàn)單個(gè)和多個(gè)文件上傳
    3、對(duì)commons fileupload組件的簡(jiǎn)單封裝

    4、Apache FileUpload文件上傳組件API解析
    5、User Guide     Apache Jakarta Project: commons FileUpload用戶指南

    注:DiskFileUpload 在 javadoc 下被標(biāo)記為過期的方法,建議用 ServletFileUpload 代替。



    Apache FileUpload文件上傳組件API解析(轉(zhuǎn))

    Java Web開發(fā)人員可以使用Apache文件上傳組件來接收瀏覽器上傳的文件,該組件由多個(gè)類共同組成,但是,對(duì)于使用該組件來編寫文件上傳功能的Java Web開發(fā)人員來說,只需要了解和使用其中的三個(gè)類:DiskFileUpload、FileItem和FileUploadException。這三個(gè)類全部位于org.apache.commons.fileupload包中。


       查看API文檔

    在準(zhǔn)備實(shí)驗(yàn)環(huán)境時(shí)獲得的commons-fileupload-1.0.zip文件的解壓縮目錄中可以看到一個(gè)docs的子目錄,其中包含了Apache文件上傳組件中的各個(gè)API類的幫助文檔,從這個(gè)文檔中可以了解到各個(gè)API類的使用幫助信息。打開文件上傳組件API幫助文檔中的index.html頁(yè)面,在左側(cè)分欄窗口頁(yè)面中列出了文件上傳組件中的各個(gè)API類的名稱,在右側(cè)分欄窗口頁(yè)面的底部列出了一段示例代碼,如圖1.2所示。

    圖1.2

    讀者不需要逐個(gè)去閱讀圖1.2中列出的各個(gè)API類的幫助文檔,而應(yīng)該以圖1.2中的示例代碼為線索,以其中所使用到的類為入口點(diǎn),按圖索驥地進(jìn)行閱讀,對(duì)于示例代碼中調(diào)用到的各個(gè)API類的方法則應(yīng)重點(diǎn)掌握。



    1. DiskFileUpload類

    DiskFileUpload類是Apache文件上傳組件的核心類,應(yīng)用程序開發(fā)人員通過這個(gè)類來與Apache文件上傳組件進(jìn)行交互。但現(xiàn)在Apache建議使用ServletFileUpload類,兩個(gè)類的方法類似。下面介紹DiskFileUpload類中的幾個(gè)常用的重要方法。

    1.1.setSizeMax方法

    setSizeMax方法用于設(shè)置請(qǐng)求消息實(shí)體內(nèi)容的最大允許大小,以防止客戶端故意通過上傳特大的文件來塞滿服務(wù)器端的存儲(chǔ)空間,單位為字節(jié)。其完整語(yǔ)法定義如下:

         public void setSizeMax(long sizeMax)

    如果請(qǐng)求消息中的實(shí)體內(nèi)容的大小超過了setSizeMax方法的設(shè)置值,該方法將會(huì)拋出FileUploadException異常。

    1.2.setSizeThreshold方法

    Apache文件上傳組件在解析和處理上傳數(shù)據(jù)中的每個(gè)字段內(nèi)容時(shí),需要臨時(shí)保存解析出的數(shù)據(jù)。因?yàn)镴ava虛擬機(jī)默認(rèn)可以使用的內(nèi)存空間是有限的(筆者測(cè)試不大于100M),超出限制時(shí)將會(huì)發(fā)生“java.lang.OutOfMemoryError”錯(cuò)誤,如果上傳的文件很大,例如上傳800M的文件,在內(nèi)存中將無法保存該文件內(nèi)容,Apache文件上傳組件將用臨時(shí)文件來保存這些數(shù)據(jù);但如果上傳的文件很小,例如上傳600個(gè)字節(jié)的文件,顯然將其直接保存在內(nèi)存中更加有效。setSizeThreshold方法用于設(shè)置是否使用臨時(shí)文件保存解析出的數(shù)據(jù)的那個(gè)臨界值,該方法傳入的參數(shù)的單位是字節(jié)。其完整語(yǔ)法定義如下:

    public void setSizeThreshold(int sizeThreshold)

    1.3. setRepositoryPath方法

    setRepositoryPath方法用于設(shè)置setSizeThreshold方法中提到的臨時(shí)文件的存放目錄,這里要求使用絕對(duì)路徑。其完整語(yǔ)法定義如下:

    public void setRepositoryPath(String repositoryPath)

    如果不設(shè)置存放路徑,那么臨時(shí)文件將被儲(chǔ)存在"java.io.tmpdir"這個(gè)JVM環(huán)境屬性所指定的目錄中,tomcat 5.5.9將這個(gè)屬性設(shè)置為了“<tomcat安裝目錄>/temp/”目錄。

    1.4. parseRequest方法

    parseRequest 方法是DiskFileUpload類的重要方法,它是對(duì)HTTP請(qǐng)求消息進(jìn)行解析的入口方法,如果請(qǐng)求消息中的實(shí)體內(nèi)容的類型不是“multipart/form-data”,該方法將拋出FileUploadException異常。parseRequest 方法解析出FORM表單中的每個(gè)字段的數(shù)據(jù),并將它們分別包裝成獨(dú)立的FileItem對(duì)象,然后將這些FileItem對(duì)象加入進(jìn)一個(gè)List類型的集合對(duì)象中返回。parseRequest 方法的完整語(yǔ)法定義如下:

    public List parseRequest(HttpServletRequest req)

    parseRequest 方法還有一個(gè)重載方法,該方法集中處理上述所有方法的功能,其完整語(yǔ)法定義如下:

    parseRequest(HttpServletRequest req,int sizeThreshold,long sizeMax,

                 String path)

    這兩個(gè)parseRequest方法都會(huì)拋出FileUploadException異常。

    1.5. isMultipartContent方法

    isMultipartContent方法方法用于判斷請(qǐng)求消息中的內(nèi)容是否是“multipart/form-data”類型,是則返回true,否則返回false。isMultipartContent方法是一個(gè)靜態(tài)方法,不用創(chuàng)建DiskFileUpload類的實(shí)例對(duì)象即可被調(diào)用,其完整語(yǔ)法定義如下:

    public static final boolean isMultipartContent(HttpServletRequest req)

    1.6. setHeaderEncoding方法

    由于瀏覽器在提交FORM表單時(shí),會(huì)將普通表單中填寫的文本內(nèi)容傳遞給服務(wù)器,對(duì)于文件上傳字段,除了傳遞原始的文件內(nèi)容外,還要傳遞其文件路徑名等信息,如后面的圖1.3所示。不管FORM表單采用的是“application/x-www-form-urlencoded”編碼,還是“multipart/form-data”編碼,它們僅僅是將各個(gè)FORM表單字段元素內(nèi)容組織到一起的一種格式,而這些內(nèi)容又是由某種字符集編碼來表示的。關(guān)于瀏覽器采用何種字符集來編碼FORM表單字段中的內(nèi)容,請(qǐng)參看筆者編著的《深入體驗(yàn)java Web開發(fā)內(nèi)幕——核心基礎(chǔ)》一書中的第6.9.2的講解,“multipart/form-data”類型的表單為表單字段內(nèi)容選擇字符集編碼的原理和方式與“application/x-www-form-urlencoded”類型的表單是相同的。FORM表單中填寫的文本內(nèi)容和文件上傳字段中的文件路徑名在內(nèi)存中就是它們的某種字符集編碼的字節(jié)數(shù)組形式,Apache文件上傳組件在讀取這些內(nèi)容時(shí),必須知道它們所采用的字符集編碼,才能將它們轉(zhuǎn)換成正確的字符文本返回。

    對(duì)于瀏覽器上傳給WEB服務(wù)器的各個(gè)表單字段的描述頭內(nèi)容,Apache文件上傳組件都需要將它們轉(zhuǎn)換成字符串形式返回,setHeaderEncoding 方法用于設(shè)置轉(zhuǎn)換時(shí)所使用的字符集編碼,其原理與筆者編著的《深入體驗(yàn)java Web開發(fā)內(nèi)幕——核心基礎(chǔ)》一書中的第6.9.4節(jié)講解的ServletRequest.setCharacterEncoding方法相同。setHeaderEncoding 方法的完整語(yǔ)法定義如下:

    public void setHeaderEncoding(String encoding)

    其中,encoding參數(shù)用于指定將各個(gè)表單字段的描述頭內(nèi)容轉(zhuǎn)換成字符串時(shí)所使用的字符集編碼。

    注意:如果讀者在使用Apache文件上傳組件時(shí)遇到了中文字符的亂碼問題,一般都是沒有正確調(diào)用setHeaderEncoding方法的原因。



    2. FileItem類

    FileItem類用來封裝單個(gè)表單字段元素的數(shù)據(jù),一個(gè)表單字段元素對(duì)應(yīng)一個(gè)FileItem對(duì)象,通過調(diào)用FileItem對(duì)象的方法可以獲得相關(guān)表單字段元素的數(shù)據(jù)。FileItem是一個(gè)接口,在應(yīng)用程序中使用的實(shí)際上是該接口一個(gè)實(shí)現(xiàn)類,該實(shí)現(xiàn)類的名稱并不重要,程序可以采用FileItem接口類型來對(duì)它進(jìn)行引用和訪問,為了便于講解,這里將FileItem實(shí)現(xiàn)類稱之為FileItem類。FileItem類還實(shí)現(xiàn)了Serializable接口,以支持序列化操作。

    對(duì)于“multipart/form-data”類型的FORM表單,瀏覽器上傳的實(shí)體內(nèi)容中的每個(gè)表單字段元素的數(shù)據(jù)之間用字段分隔界線進(jìn)行分割,兩個(gè)分隔界線間的內(nèi)容稱為一個(gè)分區(qū),每個(gè)分區(qū)中的內(nèi)容可以被看作兩部分,一部分是對(duì)表單字段元素進(jìn)行描述的描述頭,另外一部是表單字段元素的主體內(nèi)容,如圖1.3所示。

    圖 1.3

    主體部分有兩種可能性,要么是用戶填寫的表單內(nèi)容,要么是文件內(nèi)容。FileItem類對(duì)象實(shí)際上就是對(duì)圖1.3中的一個(gè)分區(qū)的數(shù)據(jù)進(jìn)行封裝的對(duì)象,它內(nèi)部用了兩個(gè)成員變量來分別存儲(chǔ)描述頭和主體內(nèi)容,其中保存主體內(nèi)容的變量是一個(gè)輸出流類型的對(duì)象。當(dāng)主體內(nèi)容的大小小于DiskFileUpload.setSizeThreshold方法設(shè)置的臨界值大小時(shí),這個(gè)流對(duì)象關(guān)聯(lián)到一片內(nèi)存,主體內(nèi)容將會(huì)被保存在內(nèi)存中。當(dāng)主體內(nèi)容的數(shù)據(jù)超過DiskFileUpload.setSizeThreshold方法設(shè)置的臨界值大小時(shí),這個(gè)流對(duì)象關(guān)聯(lián)到硬盤上的一個(gè)臨時(shí)文件,主體內(nèi)容將被保存到該臨時(shí)文件中。臨時(shí)文件的存儲(chǔ)目錄由DiskFileUpload.setRepositoryPath方法設(shè)置,臨時(shí)文件名的格式為“upload_00000005(八位或八位以上的數(shù)字).tmp”這種形式,F(xiàn)ileItem類內(nèi)部提供了維護(hù)臨時(shí)文件名中的數(shù)值不重復(fù)的機(jī)制,以保證了臨時(shí)文件名的唯一性。當(dāng)應(yīng)用程序?qū)⒅黧w內(nèi)容保存到一個(gè)指定的文件中時(shí),或者在FileItem對(duì)象被垃圾回收器回收時(shí),或者Java虛擬機(jī)結(jié)束時(shí),Apache文件上傳組件都會(huì)嘗試刪除臨時(shí)文件,以盡量保證臨時(shí)文件能被及時(shí)清除。

    下面介紹FileItem類中的幾個(gè)常用的方法:

    2.1. isFormField方法

    isFormField方法用于判斷FileItem類對(duì)象封裝的數(shù)據(jù)是否屬于一個(gè)普通表單字段,還是屬于一個(gè)文件表單字段,如果是普通表單字段則返回true,否則返回false。該方法的完整語(yǔ)法定義如下:

    public boolean isFormField()

    2.2. getName方法

    getName方法用于獲得文件上傳字段中的文件名,對(duì)于圖1.3中的第三個(gè)分區(qū)所示的描述頭,getName方法返回的結(jié)果為字符串“C:\bg.gif”。如果FileItem類對(duì)象對(duì)應(yīng)的是普通表單字段,getName方法將返回null。即使用戶沒有通過網(wǎng)頁(yè)表單中的文件字段傳遞任何文件,但只要設(shè)置了文件表單字段的name屬性,瀏覽器也會(huì)將文件字段的信息傳遞給服務(wù)器,只是文件名和文件內(nèi)容部分都為空,但這個(gè)表單字段仍然對(duì)應(yīng)一個(gè)FileItem對(duì)象,此時(shí),getName方法返回結(jié)果為空字符串"",讀者在調(diào)用Apache文件上傳組件時(shí)要注意考慮這個(gè)情況。getName方法的完整語(yǔ)法定義如下:

    public String getName()

    注意:如果用戶使用Windows系統(tǒng)上傳文件,瀏覽器將傳遞該文件的完整路徑,如果用戶使用Linux或者Unix系統(tǒng)上傳文件,瀏覽器將只傳遞該文件的名稱部分。

    2.3.getFieldName方法

    getFieldName方法用于返回表單字段元素的name屬性值,也就是返回圖1.3中的各個(gè)描述頭部分中的name屬性值,例如“name=p1”中的“p1”。getFieldName方法的完整語(yǔ)法定義如下:

    public String getFieldName()

    2.4. write方法

    write方法用于將FileItem對(duì)象中保存的主體內(nèi)容保存到某個(gè)指定的文件中。如果FileItem對(duì)象中的主體內(nèi)容是保存在某個(gè)臨時(shí)文件中,該方法順利完成后,臨時(shí)文件有可能會(huì)被清除。該方法也可將普通表單字段內(nèi)容寫入到一個(gè)文件中,但它主要用途是將上傳的文件內(nèi)容保存在本地文件系統(tǒng)中。其完整語(yǔ)法定義如下:

    public void write(File file)

    2.5.getString方法

        getString方法用于將FileItem對(duì)象中保存的主體內(nèi)容作為一個(gè)字符串返回,它有兩個(gè)重載的定義形式:

    public java.lang.String getString()

    public java.lang.String getString(java.lang.String encoding)

         throws java.io.UnsupportedEncodingException

    前者使用缺省的字符集編碼將主體內(nèi)容轉(zhuǎn)換成字符串,后者使用參數(shù)指定的字符集編碼將主體內(nèi)容轉(zhuǎn)換成字符串。如果在讀取普通表單字段元素的內(nèi)容時(shí)出現(xiàn)了中文亂碼現(xiàn)象,請(qǐng)調(diào)用第二個(gè)getString方法,并為之傳遞正確的字符集編碼名稱。

    2.6. getContentType方法

    getContentType 方法用于獲得上傳文件的類型,對(duì)于圖1.3中的第三個(gè)分區(qū)所示的描述頭,getContentType方法返回的結(jié)果為字符串“image/gif”,即“Content-Type”字段的值部分。如果FileItem類對(duì)象對(duì)應(yīng)的是普通表單字段,該方法將返回null。getContentType 方法的完整語(yǔ)法定義如下:

    public String getContentType()

    2.7. isInMemory方法

    isInMemory方法用來判斷FileItem類對(duì)象封裝的主體內(nèi)容是存儲(chǔ)在內(nèi)存中,還是存儲(chǔ)在臨時(shí)文件中,如果存儲(chǔ)在內(nèi)存中則返回true,否則返回false。其完整語(yǔ)法定義如下:

    public boolean isInMemory()

    2.8. delete方法

    delete方法用來清空FileItem類對(duì)象中存放的主體內(nèi)容,如果主體內(nèi)容被保存在臨時(shí)文件中,delete方法將刪除該臨時(shí)文件。盡管Apache組件使用了多種方式來盡量及時(shí)清理臨時(shí)文件,但系統(tǒng)出現(xiàn)異常時(shí),仍有可能造成有的臨時(shí)文件被永久保存在了硬盤中。在有些情況下,可以調(diào)用這個(gè)方法來及時(shí)刪除臨時(shí)文件。其完整語(yǔ)法定義如下:

    public void delete()



    3. FileUploadException類

    在文件上傳過程中,可能發(fā)生各種各樣的異常,例如網(wǎng)絡(luò)中斷、數(shù)據(jù)丟失等等。為了對(duì)不同異常進(jìn)行合適的處理,Apache文件上傳組件還開發(fā)了四個(gè)異常類,其中FileUploadException是其他異常類的父類,其他幾個(gè)類只是被間接調(diào)用的底層類,對(duì)于Apache組件調(diào)用人員來說,只需對(duì)FileUploadException異常類進(jìn)行捕獲和處理即可



    4. ServletRequestContext

    ServletRequestContext類提供訪問request的方法。實(shí)現(xiàn)RequestContext接口。



    MutiFileUpload.java 文件上傳封裝類

    Action 調(diào)用包裝類進(jìn)行處理

    FileItem 文件保存

    posted on 2008-10-04 12:35 黃小二 閱讀(665) 評(píng)論(0)  編輯  收藏 所屬分類: J2EE
    主站蜘蛛池模板: 亚洲真人日本在线| 亚洲综合一区国产精品| 九九视频高清视频免费观看| 亚洲免费在线视频观看| 亚洲成AV人片在线观看无码| 中文字幕成人免费高清在线 | 99国产精品永久免费视频| 亚洲av日韩av无码黑人| 日韩精品在线免费观看| 久久亚洲精精品中文字幕| 亚洲国产午夜福利在线播放| 国产亚洲成在线播放va| 成人伊人亚洲人综合网站222| 亚州**色毛片免费观看| 国产AV无码专区亚洲AV漫画| 中文字幕免费不卡二区| 久久久久亚洲Av无码专| 国产精品免费网站| 亚洲精品无码mⅴ在线观看| 国产成人免费A在线视频| 免费无码午夜福利片69| 亚洲欧洲∨国产一区二区三区| 免费人成在线观看网站品爱网 | 拔擦拔擦8x华人免费久久| 高h视频在线免费观看| 亚洲国产综合无码一区| 亚洲一区二区三区免费观看| 亚洲色欲色欲www在线播放| 亚洲精品国自产拍在线观看| 免费人成黄页在线观看日本| 91亚洲一区二区在线观看不卡 | 朝桐光亚洲专区在线中文字幕| 亚洲精品一级无码中文字幕| 久久免费视频精品| 亚洲国产精华液2020| 亚洲一区无码中文字幕| 无限动漫网在线观看免费| 中文字幕在线日亚洲9| 午夜亚洲WWW湿好爽| 最近免费中文字幕高清大全 | 三上悠亚亚洲一区高清|