利用Jakarta commons fileupload組件實(shí)現多文件上傳
曾經(jīng)寫(xiě)過(guò)一篇 文章
《利用MultipartFile實(shí)現文件上傳》,可是最近在工作中,我需要同時(shí)上傳多個(gè)文件,似乎用MultipartFile就不能勝任了,于是想到了Jakarta commons。Jakarta commons真是不錯的,有那么多開(kāi)源且好用的東東,太方便了。好了,閑話(huà)少說(shuō),開(kāi)始介紹一下jakarta commons fileupload組件吧。
首先,需要到其
官網(wǎng)上下載最新的jar包及其依賴(lài)的jar包,然后可以參考一下它的user guide,很簡(jiǎn)單,想信大家都能看懂,這里就把主要的內容提一下(相當于一個(gè)刪減的翻譯)。
一.基本原理 FileUpload組件將頁(yè)面提交的所有元素(普通form表單域,如text和文件域file)都看作一樣的FileItem,這樣上傳頁(yè)面提交的request請求也就是一個(gè)FileItem的有序組合,FileUpload組件可以解析該request,并返回一個(gè)一個(gè)的FileItem。而對每一個(gè)FileItem,FileUpload組件可以判斷出它是普通form表單域還是文件file域,從而根據不同的類(lèi)型,采取不同的操作--如果是表單域,就讀出其值,如果是文件域,就保存文件到服務(wù)器硬盤(pán)上或者內存中。
二.具體實(shí)現 對一個(gè)HttpRequest請求,我們要判斷該請求是否是文件上傳的請求
// Check that we have a file upload request
boolean isMultipart = ServletFileUpload.isMultipartContent(request); 不過(guò),個(gè)人覺(jué)得這個(gè)方法一般不需要,我們一般是在需要上傳時(shí)才采用fileupload組件處理request請求的。
如果確實(shí)是文件上傳的請求,我們如何解析該request呢?
至此我們已經(jīng)的到了FileItem的list,對每個(gè)Item的處理要考慮是標準的form表單域還是上傳文件file域,然后做不同的處理,可以通過(guò)以下方式實(shí)現:
// Process the uploaded items
Iterator iter = items.iterator();
while (iter.hasNext()) ...{
FileItem item = (FileItem) iter.next();
if (item.isFormField()) ...{
processFormField(item);
} else ...{
processUploadedFile(item);
}
} 對于一個(gè)簡(jiǎn)單的form表單域,我們可以通過(guò)以下方法得到該域的相關(guān)信息:
// Process a regular form field
if (item.isFormField()) ...{
String name = item.getFieldName();
String value = item.getString();
...
} 而對于一個(gè)upload file,我們則可以通過(guò)如下方式得到其相關(guān)信息:
// Process a file upload
if (!item.isFormField()) ...{
String fieldName = item.getFieldName();
String fileName = item.getName();
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();
...
} 實(shí)際上,對于一個(gè)上傳的文件,我們一般不會(huì )把它包存在內存中,除非它足夠小。我們一般是把它保存到硬盤(pán)上,使用以下方法就可以將上傳的文件保存到服務(wù)器硬盤(pán)上了:
File uploadedFile = new File(...);
item.write(uploadedFile); 好了,到了這里,fileupload組件的基本api已經(jīng)介紹完了,大家應該有點(diǎn)輪廓了吧?
在下一篇文章中,我會(huì )對commons FileUpload組件稍作包裝,并做個(gè)簡(jiǎn)單的demo
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1625754
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。