Apache Commons fileUpload实现文件上传

 

 将Apache的commons-fileupload.jar放在应用程序的WEB-INF\lib下,即可使用。下面举例介绍如何使用它的文件上传功能。

所使用的fileUpload版本为1.2,环境为Eclipse3.3+MyEclipse6.0。FileUpload是基于 Commons IO的,所以在进入项目前先确定Commons IO的jar包(本文使用commons-io-1.3.2.jar)在WEB-INF\lib下。

此文作示例工程可在文章最后的附件中下载。

示例1

最简单的例子,通过ServletFileUpload静态类来解析Request,工厂类FileItemFactory会对mulipart类的表单中的所有字段进行处理,不只是file字段。getName()得到文件名,getString()得到表单数据内容,isFormField()可判断是否为普通的表单项。

demo1.html

<html>

<head>

   <metahttp-equiv="Content-Type"content="text/html; charset=GB18030">

   <title>File upload</title>

</head>

<body>

      //必须是multipart的表单数据。

   <formname="myform"action="demo1.jsp"method="post"

      enctype="multipart/form-data">

      Your name: <br>

      <inputtype="text"name="name"size="15"><br>

      File:<br>

      <inputtype="file"name="myfile"><br>

      <br>

      <inputtype="submit"name="submit"value="Commit">

   </form>

</body>

</html>

 

demo1.jsp

<%@pagelanguage="java"contentType="text/html; charset=GB18030"

   pageEncoding="GB18030"%>

<%@pageimport="org.apache.commons.fileupload.*"%>

<%@pageimport="org.apache.commons.fileupload.servlet.*"%>

<%@pageimport="org.apache.commons.fileupload.disk.*"%>

<%@pageimport="java.util.*"%>

 

<!DOCTYPEHTMLPUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN">

<%

   boolean isMultipart = ServletFileUpload.isMultipartContent(request);//检查输入请求是否为multipart表单数据。

   if (isMultipart ==true) {

      FileItemFactory factory =new DiskFileItemFactory();//为该请求创建一个DiskFileItemFactory对象,通过它来解析请求。执行解析后,所有的表单项目都保存在一个List中。

      ServletFileUpload upload =new ServletFileUpload(factory);

      List<FileItem> items = upload.parseRequest(request);

      Iterator<FileItem> itr = items.iterator();

      while (itr.hasNext()) {

          FileItem item = (FileItem) itr.next();

          //检查当前项目是普通表单项目还是上传文件。

          if (item.isFormField()) {//如果是普通表单项目,显示表单内容。

      String fieldName = item.getFieldName();

      if (fieldName.equals("name"))//对应demo1.html中type="text" name="name"

          out.print("the field name is" + item.getString());//显示表单内容。

      out.print("<br>");

          }else {//如果是上传文件,显示文件名。

      out.print("the upload file name is" + item.getName());

      out.print("<br>");

          }

      }

   }else {

      out.print("the enctype must be multipart/form-data");

   }

%>

<html>

<head>

   <metahttp-equiv="Content-Type"content="text/html; charset=GB18030">

   <title>File upload</title>

</head>

<body>

</body>

</html>

结果:

the field name isjeff
the upload file name isD:\C语言考试样题\作业题.rar

示例2

上传两个文件到指定的目录。

demo2.html

<html>

<head>

   <metahttp-equiv="Content-Type"content="text/html; charset=GB18030">

   <title>File upload</title>

</head>

<body>

   <formname="myform"action="demo2.jsp"method="post"

      enctype="multipart/form-data">

      File1:<br>

      <inputtype="file"name="myfile"><br>

      File2:<br>

      <inputtype="file"name="myfile"><br>

      <br>

      <inputtype="submit"name="submit"value="Commit">

   </form>

</body>

</html>

 

demo2.jsp

<%@pagelanguage="java"contentType="text/html; charset=GB18030"

   pageEncoding="GB18030"%>

<%@pageimport="org.apache.commons.fileupload.*"%>

<%@pageimport="org.apache.commons.fileupload.servlet.*"%>

<%@pageimport="org.apache.commons.fileupload.disk.*"%>

<%@pageimport="java.util.*"%>

<%@pageimport="java.io.*"%>

 

<!DOCTYPEHTMLPUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN">

<%String uploadPath="D:\\temp";

 boolean isMultipart = ServletFileUpload.isMultipartContent(request);

 if(isMultipart==true){

    try{

      FileItemFactory factory =new DiskFileItemFactory();

      ServletFileUpload upload =new ServletFileUpload(factory);

      List<FileItem> items = upload.parseRequest(request);//得到所有的文件

     Iterator<FileItem> itr = items.iterator();

      while(itr.hasNext()){//依次处理每个文件

       FileItem item=(FileItem)itr.next();

       String fileName=item.getName();//获得文件名,包括路径

       if(fileName!=null){

           File fullFile=new File(item.getName());

           File savedFile=new File(uploadPath,fullFile.getName());

           item.write(savedFile);

       }

      }

      out.print("upload succeed");

    }

    catch(Exception e){

       e.printStackTrace();

    }

 }

 else{

    out.println("the enctype must be multipart/form-data");

 }

%>

<html>

<head>

<metahttp-equiv="Content-Type"content="text/html; charset=GB18030">

<title>File upload</title>

</head>

<body>

</body>

</html>

结果:

upload succeed

此时,在"D:\temp"下可以看到你上传的两个文件。

示例3

上传一个文件到指定的目录,并限定文件大小。

demo3.html

<html>

<head>

   <metahttp-equiv="Content-Type"content="text/html; charset=GB18030">

   <title>File upload</title>

</head>

<body>

   <formname="myform"action="demo3.jsp"method="post"

      enctype="multipart/form-data">

      File:<br>

      <inputtype="file"name="myfile"><br>

      <br>

      <inputtype="submit"name="submit"value="Commit">

   </form>

</body>

</html>

 

demo3.jsp

<%@pagelanguage="java"contentType="text/html; charset=GB18030"

   pageEncoding="GB18030"%>

<%@pageimport="org.apache.commons.fileupload.*"%>

<%@pageimport="org.apache.commons.fileupload.servlet.*"%>

<%@pageimport="org.apache.commons.fileupload.disk.*"%>

<%@pageimport="java.util.*"%>

<%@pageimport="java.io.*"%>

 

<!DOCTYPEHTMLPUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN">

<%

   File uploadPath =new File("D:\\temp");//上传文件目录

   if (!uploadPath.exists()) {

      uploadPath.mkdirs();

   }

   //临时文件目录

   File tempPathFile =new File("d:\\temp\\buffer\\");

   if (!tempPathFile.exists()) {

      tempPathFile.mkdirs();

   }

   try {

      // Create a factory for disk-based file items

      DiskFileItemFactory factory =new DiskFileItemFactory();

 

      // Set factory constraints

      factory.setSizeThreshold(4096);//设置缓冲区大小,这里是4kb

      factory.setRepository(tempPathFile);//设置缓冲区目录

 

      // Create a new file upload handler

      ServletFileUpload upload =new ServletFileUpload(factory);

 

      // Set overall request size constraint

      upload.setSizeMax(4194304);//设置最大文件尺寸,这里是4MB

 

      List<FileItem> items = upload.parseRequest(request);//得到所有的文件

      Iterator<FileItem> i = items.iterator();

      while (i.hasNext()) {

          FileItem fi = (FileItem) i.next();

          String fileName = fi.getName();

          if (fileName !=null) {

      File fullFile =new File(fi.getName());

      File savedFile =new File(uploadPath, fullFile

             .getName());

      fi.write(savedFile);

          }

      }

      out.print("upload succeed");

   }catch (Exception e) {

      e.printStackTrace();

   }

%>

<html>

<head>

<metahttp-equiv="Content-Type"content="text/html; charset=GB18030">

<title>File upload</title>

</head>

<body>

</body>

</html>

示例4

利用Servlet来实现文件上传。

Upload.java

package com.zj.sample;

 

import java.io.File;

import java.io.IOException;

import java.util.Iterator;

import java.util.List;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import org.apache.commons.fileupload.FileItem;

import org.apache.commons.fileupload.disk.DiskFileItemFactory;

import org.apache.commons.fileupload.servlet.ServletFileUpload;

 

@SuppressWarnings("serial")

public class Uploadextends HttpServlet {

   private StringuploadPath ="D:\\temp";//上传文件的目录

   private StringtempPath ="d:\\temp\\buffer\\";//临时文件目录

   FiletempPathFile;

 

   @SuppressWarnings("unchecked")

   public void doPost(HttpServletRequest request, HttpServletResponse response)

          throws IOException, ServletException {

      try {

          // Create a factory for disk-based file items

          DiskFileItemFactory factory =new DiskFileItemFactory();

 

          // Set factory constraints

          factory.setSizeThreshold(4096);//设置缓冲区大小,这里是4kb

          factory.setRepository(tempPathFile);//设置缓冲区目录

 

          // Create a new file upload handler

          ServletFileUpload upload =new ServletFileUpload(factory);

 

          // Set overall request size constraint

          upload.setSizeMax(4194304);//设置最大文件尺寸,这里是4MB

 

          List<FileItem> items = upload.parseRequest(request);//得到所有的文件

          Iterator<FileItem> i = items.iterator();

          while (i.hasNext()) {

             FileItem fi = (FileItem) i.next();

             String fileName = fi.getName();

             if (fileName !=null) {

                 File fullFile =new File(fi.getName());

                 File savedFile =new File(uploadPath, fullFile.getName());

                 fi.write(savedFile);

             }

          }

          System.out.print("upload succeed");

      }catch (Exception e) {

          //可以跳转出错页面

          e.printStackTrace();

      }

   }

 

   public void init()throws ServletException {

      File uploadFile =new File(uploadPath);

      if (!uploadFile.exists()) {

          uploadFile.mkdirs();

      }

      File tempPathFile =new File(tempPath);

      if (!tempPathFile.exists()) {

          tempPathFile.mkdirs();

      }

   }

}

 

demo4.html

<html>

<head>

   <metahttp-equiv="Content-Type"content="text/html; charset=GB18030">

   <title>File upload</title>

</head>

<body>

// action="fileupload"对应web.xml中<servlet-mapping>中<url-pattern>的设置.

   <formname="myform"action="fileupload"method="post"

      enctype="multipart/form-data">

      File:<br>

      <inputtype="file"name="myfile"><br>

      <br>

      <inputtype="submit"name="submit"value="Commit">

   </form>

</body>

</html>

 

web.xml

<servlet>

   <servlet-name>Upload</servlet-name>

   <servlet-class>com.zj.sample.Upload</servlet-class>

</servlet>

 

<servlet-mapping>

   <servlet-name>Upload</servlet-name>

   <url-pattern>/fileupload</url-pattern>

</servlet-mapping>

posted @ 2011-07-29 09:49  javait03  阅读(284)  评论(0)    收藏  举报