教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢(xún)/投訴熱線(xiàn):400-618-4000

Java上傳文件API匯總

更新時(shí)間:2021年10月28日15時(shí)47分 來(lái)源:傳智教育 瀏覽次數(shù):

好口碑IT培訓(xùn)

一、FileItem接口

Fileltem接口用于封裝單個(gè)表單字段元素的數(shù)據(jù),一個(gè)表單字段元素對(duì)應(yīng)一個(gè)Fileltem對(duì)象。為了便于講解,在此將Fileltem的實(shí)現(xiàn)類(lèi)稱(chēng)為Fileltem類(lèi),F(xiàn)ileltem類(lèi)實(shí)現(xiàn)了Serializable接口,因此,支持序列化操作。在FiIeItem類(lèi)中人素的方法,具體如下。


1. boolean isFormField()方法

isFormField()方法用于判斷FileItem類(lèi)對(duì)象封裝的數(shù)據(jù)是一個(gè)普通文本表單字段,還是一個(gè)文件表單字段,如果是普通表單字段則返回true,否則返回false。


2.String getName()方法

getName()方法用于獲得文件上傳字段中的文件名。如果FileItem類(lèi)對(duì)象對(duì)應(yīng)的是普通表單字段,getName()方法將返回null,否則,只要瀏覽器將文件的字段信息傳遞給服務(wù)器,getName()方法就會(huì)返回一個(gè)字符串類(lèi)型的結(jié)果,如“C:\Sunset.jpg”。

需要注意的是,通過(guò)不同瀏覽器上傳的文件,獲取到的完整路徑和名稱(chēng)都是不一樣的。例如,用戶(hù)使用IE瀏覽器上傳文件,獲取到的就是完整的路徑“C:\Sunset.jpg”,如果使用其他瀏覽器,比如火狐,獲取到的僅僅是文件名,沒(méi)有路徑,如“Sunset.jpg”。


3.String getFieldName()方法

getFieldName()方法用于獲得表單字段元素描述頭的name屬性值,也是表單標(biāo)簽name屬性的值,例如“name=file1”中的“file1”。


4. void write(File file)方法

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


5.String getString()方法

getString()方法用于將Fileltem對(duì)象中保存的數(shù)據(jù)流內(nèi)容以一個(gè)字符串返回,它有兩個(gè)重載的定義形式;

(1) public String getString()

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

在上面重載的兩個(gè)方法中,前者使用默認(rèn)的字符集編碼將主體內(nèi)容轉(zhuǎn)換成字符串,后者使用參數(shù)指足的子付集編碼將主體內(nèi)容轉(zhuǎn)換成字符串。需要注意的是,如果在讀取普通表單字段無(wú)系內(nèi)谷時(shí)出現(xiàn)中文亂碼現(xiàn)象,請(qǐng)調(diào)用第二個(gè)getString)方法,并為之傳遞正確的字符集編碼名稱(chēng)。

倘名外Rssicod.sayThelos oninte .emelblait pait2 )moilelssto molleli


6. String getContentType()方法

getContentType()方法用于獲得上傳文件的類(lèi)型,即表單字段元素描述頭屬性“Content-Type”的值,如"image/jpeg”。如果FileItem類(lèi)對(duì)象對(duì)應(yīng)的是普通表單字段,該方法將返回null。


7.boolean islnMemory()方法

isInMemory()方法用來(lái)判斷FileItem對(duì)象封裝的數(shù)據(jù)內(nèi)容是存儲(chǔ)在內(nèi)存中,還是存儲(chǔ)在臨時(shí)文件中,如果存儲(chǔ)在內(nèi)存中則返回true,否則返回false。


8. void delete()方法

delete()方法用來(lái)清空FileItem類(lèi)對(duì)象中存放的主體內(nèi)容,如果主體內(nèi)容被保存在臨時(shí)文件中,delete()方法將刪除該臨時(shí)文件。需要注意的是,盡管Fileltem對(duì)象被垃圾收集器收集時(shí)會(huì)自動(dòng)清除臨時(shí)文件,但應(yīng)該及時(shí)調(diào)用delete()方法清除臨時(shí)文件,從而釋放系統(tǒng)存儲(chǔ)資源,以防系統(tǒng)出現(xiàn)異常,導(dǎo)致臨時(shí)文件被永久地保存在硬盤(pán)中。


9. InputStream getlnputStream()方法

getInputStream()方法以流的形式返回上傳文件的數(shù)據(jù)內(nèi)容。


10. long getSize()方法

getSize()方法返回該上傳文件的大小(以子節(jié)為單)。


二、DiskFileltemFactory類(lèi)

DiskFileltemFactory類(lèi)用于將請(qǐng)求消息實(shí)體中的每一個(gè)文件封裝成單獨(dú)的Fileltem對(duì)象。如果卜傳的文件比較小。將直接保存在內(nèi)存中,如果上傳的文件比較大,則會(huì)以臨時(shí)文件的形式,保存在磁盤(pán)的臨時(shí)文件夾中。默認(rèn)情況下,文件保存在內(nèi)存還是硬盤(pán)臨時(shí)文件夾的臨界值是10240,即10KB。接下來(lái),首先了解一下DiskFileItemFactory類(lèi)的兩個(gè)構(gòu)造方法:


DiskFileItemFactory()

采用默認(rèn)臨界值和系統(tǒng)臨時(shí)文件夾構(gòu)造文件項(xiàng)工廠(chǎng)對(duì)象

DiskFileItemFactory(int sizeThreshold,F(xiàn)ilerepository)

采用參數(shù)指定臨界值和系統(tǒng)臨時(shí)文件夾構(gòu)造文件項(xiàng)工廠(chǎng)對(duì)象

上面DiskFileltemFactory類(lèi)的兩個(gè)構(gòu)造方法,其中,第二個(gè)構(gòu)造方法需要傳遞兩個(gè)參數(shù),參數(shù)sizeThreshold代表文件保存在內(nèi)還是磁盤(pán)臨時(shí)文件夾的臨界值,參數(shù)repository表示臨時(shí)文件的存儲(chǔ)路徑。

接下來(lái),針對(duì)DiskFileItemFactory類(lèi)的常用方法進(jìn)行詳細(xì)講解,具體如下所示。


1. Fileltem createltem(String fieldName, String contentType,boolean isFormField,String fileName)方法

該方法用于將請(qǐng)求消息實(shí)體創(chuàng)建成Fileltem類(lèi)型的實(shí)例對(duì)象。需要注意的是,該方法是FileUpload組件在解析請(qǐng)求時(shí)內(nèi)部自動(dòng)調(diào)用,無(wú)須管理。


2. setSizeThreshold(int sizeThreshold)和getSizeThreshold()方法

setSizeThreshold(int sizeThreshold)方法用于設(shè)置是否將上傳文件以臨時(shí)文件的形式保存在磁盤(pán)的臨界值。當(dāng)Apache文件上傳組件解析上傳的數(shù)據(jù)時(shí),需要將解析后的數(shù)據(jù)臨時(shí)保存,以便后續(xù)對(duì)數(shù)據(jù)進(jìn)一步處理。由于Java虛擬機(jī)可使用的內(nèi)存空間是有限的,因此,需要根據(jù)上傳文件的大小決定文件的保存位置。例如,一個(gè)800MB的文件,是無(wú)法在內(nèi)存中臨時(shí)保存的,這時(shí),Apache文件上傳組件可以采用臨時(shí)文件的方式來(lái)保存這些數(shù)據(jù)。但是,如果上傳的文件很小,只有600KB,顯然將其保存在內(nèi)存中是比較好的選擇。另外,對(duì)應(yīng)的getSizeThreshold()方法用來(lái)獲取此臨界值。


3. setRepository(File repository)和getRepository()方法

如果上傳文件的大小大于setSizeThreshold()方法設(shè)置的臨界值,這時(shí),可以采用setRepository()方法,將上傳的文件以臨時(shí)文件的形式保存在指定的目錄下。在默認(rèn)情況下,采用的是系統(tǒng)默認(rèn)的臨時(shí)文件路徑,可以通過(guò)以下方式獲取。

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

另外,對(duì)應(yīng)的getRepository()方法用于獲取臨時(shí)文件。


三、ServletFileUpload類(lèi)

ServletFileUpload類(lèi)是Apache組件處理文件上傳的核心高級(jí)類(lèi),通過(guò)使用parseRequest(HttpServletRequest)方法可以將HTML中每個(gè)表單提交的數(shù)據(jù)封裝成個(gè)Fileltem對(duì)象,然后以L(fǎng)ist列表的形式返回。接下來(lái),首先看一下ServletFileUpload類(lèi)的構(gòu)造方法如下所示:


ServletFileUpload()

構(gòu)造一個(gè)未初始化的ServletFileUpload實(shí)例對(duì)象


ServletFileUpload(FileItemFactory fileItemFactory)

根據(jù)參數(shù)指定的FileItemFactory對(duì)象創(chuàng)建一個(gè)ServletFileUpload對(duì)象

由于在文件上傳過(guò)程中,F(xiàn)ileltemFactory類(lèi)必須設(shè)置,因此,在使用第一個(gè)構(gòu)造方法創(chuàng)建ServletFileUpload對(duì)象時(shí),首先需要在解析請(qǐng)求之前調(diào)用setFileltemFactory()方法設(shè)置fileltemFactory屬性。

了解了ServletFileUpload對(duì)象的創(chuàng)建,接下來(lái),學(xué)習(xí)一下ServletFileUpload類(lèi)的方法,具體如下。


1. setSizeMax(long sizeMax)和getSizeMax()方法

setSizeMax()方法繼承自FileUploadBase類(lèi),用于設(shè)置請(qǐng)求消息實(shí)體內(nèi)容(即所有上數(shù)據(jù))的最大尺寸限制,以防止客戶(hù)端惡意上傳超大文件來(lái)浪費(fèi)服務(wù)器端的存儲(chǔ)空間。其中,參數(shù)sizeMax以字節(jié)為單位。

另外,對(duì)應(yīng)的getSizeMax()方法用于讀取請(qǐng)求消息實(shí)體內(nèi)容所允許的最大值。


2.setFileSizeMax(long fileSizeMax)方法

setFileSizeMax()方法繼承自FileUploadBase類(lèi),用于設(shè)置單個(gè)上傳文件的最大尺限制,以防止客戶(hù)端惡意上傳超大文件來(lái)浪費(fèi)服務(wù)器端的存儲(chǔ)空間。其中,參數(shù)fileSizeMax是以字節(jié)為單位。

另外,對(duì)應(yīng)的getFileSizeMax()方法用于獲取單個(gè)上傳文件所允許的最大值。


3. parseRequest(javax.servlet.http.HttpServletRequest req)

parseRequest()方法是ServletFileUpload類(lèi)的重要方法,它是對(duì)HTTP請(qǐng)求消息體內(nèi)容進(jìn)行解析的入口。它解析出FORM表單中的每個(gè)字段的數(shù)據(jù),并將它們分別包裝成獨(dú)立的Fileltem對(duì)象,然后將這些Fileltem對(duì)象加入進(jìn)一個(gè) List類(lèi)型的集合對(duì)象中返回。


4. getltemlterator(HttpServletRequest request)

getItemIterator()方法和parseRequest()方法基本相同。但是getItemIterator()方法返回的是一個(gè)迭代器,該迭代器中保存的不是Fileltem對(duì)象,而是FileltemStream對(duì)象果希望進(jìn)一步提高性能,可以采用getItemIterator()方法,直接獲得每一個(gè)文件項(xiàng)的數(shù)據(jù)輸人流,做底層處理;如果性能不是問(wèn)題,希望代碼簡(jiǎn)單,則采用parseRequest()方法即可。


5. isMultipartContent(HttpServletRequest req)

isMultipartContent()方法用于判斷請(qǐng)求消息中的內(nèi)容是否是multipart/form-data類(lèi)型,如果是,則返回true,否則返回false。需要注意的是,isMultipartContent()方法是靜態(tài)方法,不用創(chuàng)建ServletFileUpload類(lèi)的實(shí)例對(duì)象即可被調(diào)用。


6. getFileltemFactory()和setFileltemFactory(FileltemFactory factory)

這兩個(gè)方法繼承自FileUpload類(lèi),分別用于讀取和設(shè)置fileltemFactory屬性。


7. setHeaderEncoding(String encoding)方法和getHeaderEncoding()方法

這兩個(gè)方法繼承自FileUploadBase類(lèi),用于設(shè)置和讀取字符編碼。需要注意的是,如果沒(méi)有使用setHeaderEncoding()設(shè)置字符編碼,則getHeaderEncoding()方法返回null,上傳組件會(huì)采用HttDServletRequest設(shè)置的字符編碼。但是,如果HttpServletRequest的字符編碼和為null,這時(shí),上傳組件將采用系統(tǒng)默認(rèn)的字符編碼。獲取系統(tǒng)默認(rèn)字符編碼的方式如下所示:

System.getProperty("file.encoding")


0 分享到:
和我們?cè)诰€(xiàn)交談!