Spring, Myface, tomcat manager上傳都是用這個組件. 可以支持多個文件上傳的, 習慣了UploadFile和MultipleRequest用用這個也好, 別太傻瓜了嘛, 或者自己直接從request里面拿內(nèi)容.
影響當中上傳的會是類似的格式
Contenttype, zip.....
c:\aaa\bbb\cccc.zip
---------------------一些對稱的標記符 好像沒文件長度?....
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx文件內(nèi)容
---------------------對稱標記符.
<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();
//應該還有個file thread hole
//這個是buffer size?
upload.setSizeMax(-1);
//保存的臨時路徑?
upload.setRepositoryPath(currentPath);
//這步應該不會保存上傳文件為臨時文件吧? 應該只是列表, 適合的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和其他傳過來的參數(shù).
else ...{
item.delete();
}
}
if (uploadFileItem == null) ...{
out.print("<font color=red>Upload failed.</font>");
return;
}
//FileItem有個write的方法, 建議去追下代碼看看具體是把臨時文件重命名還是拷貝
//有些人上傳的時候會把一些文件改下后綴弄個把木馬也弄上來了, 沒個殺毒軟件是不行的服務器.
public boolean write(File targetFile) {
try {
fileItem.write(targetFile);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}