环境:
tomcat5.6
commmons-fileupload-1.3.jar
commmons-io-2.4.jar
JSP
编码:UTF-8
临时文件夹:fileupload/tmp相对于网站根目录
上传文件保存位置:fileupload
Traditional API上传方式 //fileload01.htm
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">
<html>
<body>
<form method=\"POST\" enctype=\"multipart/form-data\" action=\"traditionalapi.jsp\">
File to upload: <input type=\"file\" name=\"file\" size=\"40\"><br/>
<input type=\"submit\" value=\"Press\"> to upload the file!
</form>
</body>
</html>
//traditionalapi.jsp
<%@page contentType=\"text/html;charset=UTF-8\" pageEncoding=\"UTF-8\" language=\"java\"%>
<%@page import=\"java.io.File\"%>
<%@page import=\"java.util.List\"%>
<%@page import=\"org.apache.commons.fileupload.*\"%>
<%@page import=\"org.apache.commons.fileupload.disk.DiskFileItemFactory\"%>
<%@page import=\"org.apache.commons.fileupload.servlet.ServletFileUpload\"%>
<%
request.setCharacterEncoding(\"UTF-8\");
// file less than 10kb will be store in memory, otherwise in file system.
final int threshold = 10240;
final File tmpDir = new File(getServletContext().getRealPath(\"/\") + \"fileupload\" + File.separator + \"tmp\");
final int maxRequestSize = 1024 * 1024 * 4; // 4MB
// Check that we have a file upload request
if(ServletFileUpload.isMultipartContent(request))
{
// Create a factory for disk-based file items.
FileItemFactory factory = new DiskFileItemFactory(threshold, tmpDir);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Set overall request size constraint.
upload.setSizeMax(maxRequestSize);
List<FileItem> items = upload.parseRequest(request); // FileUploadException
for(FileItem item : items)
{
if(item.isFormField()) //regular form field
{
String name = item.getFieldName();
String value = item.getString();
%>
<h1><%=name%> --> <%=value%></h1>
<%
}
else
{ //file upload
String fieldName = item.getFieldName();
String fileName = item.getName();
File uploadedFile = new File(getServletContext().getRealPath(\"/\") +
\"fileupload\" + File.separator + fieldName + \"_\" + fileName);
item.write(uploadedFile);
%>
<h1>upload file <%=uploadedFile.getName()%> done!</h1>
<%
}
}
}
%>
Streaming API上传方式 //fileupload02.htm
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">
<html>
<body>
<form method=\"POST\" enctype=\"multipart/form-data\" action=\"streamingapi.jsp\">
File to upload: <input type=\"file\" name=\"file\" size=\"40\"><br/>
<input type=\"submit\" value=\"Press\"> to upload the file!
</form>
</body>
</html>
//streamingapi.jsp
<%@page contentType=\"text/html;charset=UTF-8\" pageEncoding=\"UTF-8\" language=\"java\"%>
<%@page import=\"java.io.*\"%>
<%@page import=\"java.util.List\"%>
<%@page import=\"org.apache.commons.fileupload.*\"%>
<%@page import=\"org.apache.commons.fileupload.util.Streams\"%>
<%@page import=\"org.apache.commons.fileupload.servlet.ServletFileUpload\"%>
<%
request.setCharacterEncoding(\"UTF-8\");
// Check that we have a file upload request
if(ServletFileUpload.isMultipartContent(request))
{
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload();
// Parse the request
FileItemIterator iter = upload.getItemIterator(request);
while(iter.hasNext())
{
FileItemStream item = iter.next();
String fieldName = item.getFieldName();
InputStream is = item.openStream();
if(item.isFormField()) //regular form field
{
%>
<!-- read a FileItemStream\'s content into a string. -->
<h1><%=fieldName%> --> <%=Streams.asString(is)%></h1>
<%
}
else
{ //file upload
String fileName = item.getName();
File uploadedFile = new File(getServletContext().getRealPath(\"/\") +
\"fileupload\" + File.separator + fieldName + \"_\" + fileName);
OutputStream os = new FileOutputStream(uploadedFile);
// write file to disk and close outputstream.
Streams.copy(is, os, true);
%>
<h1>upload file <%=uploadedFile.getName()%> done!</h1>
<%
}
}
}
%>
Traditional API vs Streaming API Streaming API上传速度相对较快。因为它是利用内存保存上传的文件,节省了传统API将文件写入临时文件带来的开销。
可参考:
http://stackoverflow.com/questions/11620432/apache-commons-fileupload-streaming-api
This page describes the traditional API of the commons fileupload library. The traditional API is a convenient approach. However, for ultimate performance, you might prefer the faster Streaming API.
http://commons.apache.org/proper/commons-fileupload/using.html