Introduction and application of two upload methods of Apache FileUpload

  • 2020-05-27 06:55:53
  • OfStack

Environment:
tomcat5.6
commmons-fileupload-1.3.jar
commmons-io-2.4.jar
JSP
Code: UTF - 8
Temporary folder: fileupload/tmp relative to the site root directory
Upload file save location: fileupload
Traditional API upload method
//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 upload method
//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 is relatively fast to upload. Because it USES memory to save uploaded files, it saves the traditional API overhead of writing files to temporary files.
May refer to:
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

Related articles: