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将文件写入临时文件带来的开销。

  可参考:

  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