更新時(shí)間:2020年12月18日15時(shí)56分 來(lái)源:傳智教育 瀏覽次數(shù):
在Web應(yīng)用中,由于大多數(shù)文件的上傳都是通過(guò)表單的形式提交給服務(wù)器的,因此,要想在程序中實(shí)現(xiàn)文件上傳的功能,首先得創(chuàng)建一個(gè)用于提交上傳文件的表單頁(yè)面。需要注意的是,為了使Servlet程序可以獲取到上傳文件的數(shù)據(jù),需要將表單頁(yè)面的method屬性設(shè)置為post方式,enctype屬性設(shè)置為“multipart/form-data”類(lèi)型,添加文件的input標(biāo)簽類(lèi)型設(shè)置為file類(lèi)型。示例如下:
<%--指定表單數(shù)據(jù)的 enctype 屬性以及提交方式 --%> <form enctype="multipart/form-data" method="post"> <%-- 指定標(biāo)記的類(lèi)型和普通表單的名稱(chēng) --%> 用戶(hù)名:<input type="text" name="name"/><br/> <%--指定標(biāo)記的類(lèi)型和文件域的名稱(chēng)--%> 選擇上傳文件:<input type="file" name="myfile"/><br/>
當(dāng)瀏覽器通過(guò)表單提交上傳文件時(shí),由于文件數(shù)據(jù)都附帶在HTTP請(qǐng)求消息體中,并且采用MIME類(lèi)型(多用途互聯(lián)網(wǎng)郵件擴(kuò)展類(lèi)型)進(jìn)行描述。因此,瀏覽器發(fā)送給服務(wù)器的HTTP消息比較特殊,具體示例如下:
multipart/form-data;boundary=----------------------------7dfa7a30650 ----------------------------7dfa7a30650 Content-Disposition: form-data;name="name" itcast ----------------------------7dfa7a30650 Content-Disposition: form-data;name="myfile";filename="uploadfile.txt" Content-Type: text/plain m.8y3kgpwe.cn ----------------------------7dfa7a30650--
從上面的表單請(qǐng)求正文可以看出,請(qǐng)求正文分為多個(gè)部分,解析這部分內(nèi)容比較麻煩。為此,Apache組織提供了一個(gè)開(kāi)源組件Commons-FileUpload,該組件可以方便地將“multipart/form-data”類(lèi)型請(qǐng)求中的各種表單域解析出來(lái),并實(shí)現(xiàn)一個(gè)或多個(gè)文件的上傳,同時(shí)也可以限制上傳文件的大小等內(nèi)容,并且性能優(yōu)異,使用極其簡(jiǎn)單。需要注意的是,在使用FileUpload組件時(shí),需要導(dǎo)入commons-fileupload和commons-io兩個(gè)jar包。
為了大家更好地理解FileUpload組件是如何實(shí)現(xiàn)文件的上傳功能,接下來(lái),打開(kāi)FileUpload組件的幫助文檔,查看其實(shí)現(xiàn)方式,具體如圖6-1所示。
圖1 fileUpload類(lèi)源碼
從圖1中可以看出,F(xiàn)ileUpload組件也是通過(guò)Servlet來(lái)實(shí)現(xiàn)文件上傳功能的。其工作流程如圖2所示。
圖2 FileUpload組件實(shí)現(xiàn)文件上傳的工作流程
從圖2中可以看出,實(shí)現(xiàn)文件的上傳會(huì)涉及到幾個(gè)陌生類(lèi),這些類(lèi)都是Apache組件上傳文件的核心類(lèi)。關(guān)于這些核心類(lèi)的相關(guān)知識(shí),將在下面的小節(jié)進(jìn)行詳細(xì)講解。
猜你喜歡:北京校區(qū)