Apache FileUpload的兩種上傳方式介紹

環境:


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將文件寫入臨時文件帶來的開銷。
可參考:
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.






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章