0
点赞
收藏
分享

微信扫一扫

Apache Commons fileUpload实现文件上传


http://zhangjunhd.blog.51cto.com/113473/18331

Apache的commons-fileupload.jar可方便的实现文件的上传功能,本文通过实例来介绍如何使用commons-fileupload.jar。


@author:ZJ 07-2-22


Blog: [url]http://zhangjunhd.blog.51cto.com/[/url]


    将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>


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


     <title>File upload</title>


</head>


<body>


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


     <form name="myform" action="demo1.jsp" method="post"


        enctype="multipart/form-data">


        Your name: <br>


        <input type="text" name="name" size="15"><br>


        File:<br>


        <input type="file" name="myfile"><br>


        <br>


        <input type="submit" name="submit" value="Commit">


     </form>


</body>


</html>


 


demo1.jsp


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


     pageEncoding="GB18030"%>


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


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


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


<%@  page import="java.util.*"%>


 


<!DOCTYPE HTML PUBLIC  "-//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);


       


       


        while (itr.hasNext()) {


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


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


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


       


        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>


     <meta http-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>


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


     <title>File upload</title>


</head>


<body>


     <form name="myform" action="demo2.jsp" method="post"


        enctype="multipart/form-data">


        File1:<br>


        <input type="file" name="myfile"><br>


        File2:<br>


        <input type="file" name="myfile"><br>


        <br>


        <input type="submit" name="submit" value="Commit">


     </form>


</body>


</html>


 


demo2.jsp


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


     pageEncoding="GB18030"%>


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


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


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


<%@  page import="java.util.*"%>


<%@  page import="java.io.*"%>


 


<!DOCTYPE HTML PUBLIC  "-//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);//得到所有的文件


    


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


       


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


          if(fileName!=null){


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


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


           


       


    


         out.print("upload succeed");


    


       catch(Exception e){


       


    


  


   else{


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


  


%>


<html>


<head>


<meta http-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>


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


     <title>File upload</title>


</head>


<body>


     <form name="myform" action="demo3.jsp" method="post"


        enctype="multipart/form-data">


        File:<br>


        <input type="file" name="myfile"><br>


        <br>


        <input type="submit" name="submit" value="Commit">


     </form>


</body>


</html>


 


demo3.jsp


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


     pageEncoding="GB18030"%>


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


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


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


<%@  page import="java.util.*"%>


<%@  page import="java.io.*"%>


 


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


<%


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


     if (!uploadPath.exists()) {


       


    


     // 临时文件目录


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


     if (!tempPathFile.exists()) {


       


    


     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);//得到所有的文件


       


        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());


       


           }


       


        out.print("upload succeed");


     } catch (Exception e) {


       


    


%>


<html>


<head>


<meta http-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")


publicclass Upload extends HttpServlet {


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


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


     File tempPathFile;


 


     @SuppressWarnings("unchecked")


     publicvoid 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();


       


    


 


     publicvoid 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>


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


     <title>File upload</title>


</head>


<body>


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


     <form name="myform" action="fileupload" method="post"


        enctype="multipart/form-data">


        File:<br>


        <input type="file" name="myfile"><br>


        <br>


        <input type="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>

本文出自 “子 孑” 博客,请务必保留此出处http://zhangjunhd.blog.51cto.com/113473/18331

 

举报

相关推荐

0 条评论