Spring, Myface, tomcat manager上傳都是用這個(gè)組件. 可以支持多個(gè)文件上傳的, 習慣了UploadFile和MultipleRequest用用這個(gè)也好, 別太傻瓜了嘛, 或者自己直接從request里面拿內容.
影響當中上傳的會(huì )是類(lèi)似的格式
Contenttype, zip.....
c:\aaa\bbb\cccc.zip
---------------------一些對稱(chēng)的標記符 好像沒(méi)文件長(cháng)度?....
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx文件內容
---------------------對稱(chēng)標記符.
<FORM name=uploadForm action=upload.jsp method=post encType=‘multipart/form-data‘>
Please select one file to upload:
<INPUT type=file size=100 name=uploadFile> <input type=submit name=uploadButton value=‘Start upload‘ onClick="displayLoadingBar(‘Uploading file, please wait...‘)">
</FORM>
<%@page import="org.apache.commons.fileupload.FileItem"%>
<%@page import="java.util.Iterator"%>
<%@page import="java.util.List"%>
<%@page import="java.io.File"%>
<%@page import="org.apache.commons.fileupload.DiskFileUpload"%>
String currentPath = (String) session.getAttribute("currentPath");
DiskFileUpload upload = new DiskFileUpload();
//應該還有個(gè)file thread hole
//這個(gè)是buffer size?
upload.setSizeMax(-1);
//保存的臨時(shí)路徑?
upload.setRepositoryPath(currentPath);
//這步應該不會(huì )保存上傳文件為臨時(shí)文件吧? 應該只是列表, 適合的FileItem可以獲取到content type
//大小.
List items = upload.parseRequest(request);
Iterator iter = items.iterator();
//We only allow to upload one file right now.
final String UPLOAD_FILE_FIELD = "uploadFile";
FileItem uploadFileItem = null;
while (iter.hasNext()) ...{
FileItem item = (FileItem) iter.next();
//System.out.println("fieldName=" + item.getFieldName() + ",isFormField=" + item.isFormField());
if (!item.isFormField() && UPLOAD_FILE_FIELD.equals(item.getFieldName()) && uploadFileItem == null) ...{
uploadFileItem = item;
}
//剩下的這些應該就是form的field, 例如input type=text和其他傳過(guò)來(lái)的參數.
else ...{
item.delete();
}
}
if (uploadFileItem == null) ...{
out.print("<font color=red>Upload failed.</font>");
return;
}
//FileItem有個(gè)write的方法, 建議去追下代碼看看具體是把臨時(shí)文件重命名還是拷貝
//有些人上傳的時(shí)候會(huì )把一些文件改下后綴弄個(gè)把木馬也弄上來(lái)了, 沒(méi)個(gè)殺毒軟件是不行的服務(wù)器.
public boolean write(File targetFile) {
try {
fileItem.write(targetFile);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}