`
高级java工程师
  • 浏览: 410906 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java上传比较实例

阅读更多
jsp文件上传大多采用采用开源项目来简化处理,这里列出常用的两个jar包的实现,并进行比较,说明他们的优缺点和应该注意的问题。

Commons FileUpload,可以在http://jakarta.apache.org/commons/fileupload/下载,这个包需要Commons IO的支持,可以在http://jakarta.apache.org/commons/io/下载

com.oreilly.servlet,可以在http://www.servlets.com/cos/下载
Commons FileUpload提供三种文件上传处理方式,DiskFileUpload、ServletFileUpload和PortletFileUpload三种方式,其中DiskFileUpload已经在javadoc下已经被标记为过期的方法,建议用ServletFileUpload代替,而PortletFileUpload需要配合portlet-api来使用,所以这里我们只介绍ServletFileUpload,并且这个也是最常用的。

com.oreilly.servlet也提供了三种文件上传的处理方式,MultipartWrapper、MultipartRequest和MultipartParser三种方式,其中MultipartWrapper和MultipartRequest的用法基本相同,并且没有MultipartRequest提供的操作多,所以这里介绍MultipartRequest,MultipartParser和前两者有些不同,可以用来处理某些特殊情况,例如表单中有两个同名的文件上传选择框。

我们暂时称三面三种文件上传方式分别为:ServletFileUpload方式(MultipartTestServlet)、MultipartRequest方式(MultipartTestServlet2)、MultipartParser方式(MultipartTestServlet3)

代码如下:
test.html

<%@ page language="java" import="java.util.*" contentType="text/html;charset=gbk" pageEncoding="gbk"%>
<html>
  <body>
    <form action="MultipartTestServlet" enctype="multipart/form-data" method="post">
     <input type="text" name="username" /><br />
     <input type="file" name="myfile" /><br/>
     <input type="file" name="myfile" /><br/>
     <input type="submit" />
    </form>
    <br/><br/><br/><br/>
    <form action="MultipartTestServlet2" enctype="multipart/form-data" method="post">
     <input type="text" name="username" /><br />
     <input type="file" name="myfile" /><br/>
     <input type="file" name="myfile" /><br/>
     <input type="submit" />
    </form>
    <br/><br/><br/><br/>
    <form action="MultipartTestServlet3" enctype="multipart/form-data" method="post">
     <input type="text" name="username" /><br />
     <input type="file" name="myfile" /><br/>
     <input type="file" name="myfile" /><br/>
     <input type="submit" />
    </form>
  </body>
</html>
MultipartTestServlet.java

package com.bug.servlet;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
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.FileUpload;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.RequestContext;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.servlet.ServletRequestContext;

public class MultipartTestServlet extends HttpServlet {

public MultipartTestServlet() {
  super();
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {

  request.setCharacterEncoding("gbk");
  RequestContext requestContext = new ServletRequestContext(request);
 
  if(FileUpload.isMultipartContent(requestContext)){
  
   DiskFileItemFactory factory = new DiskFileItemFactory();
   factory.setRepository(new File("c:/tmp/"));
   ServletFileUpload upload = new ServletFileUpload(factory);
   //upload.setHeaderEncoding("gbk");
   upload.setSizeMax(2000000);
   List items = new ArrayList();
    try {
     items = upload.parseRequest(request);
    } catch (FileUploadException e1) {
     System.out.println("文件上传发生错误" + e1.getMessage());
    }

   Iterator it = items.iterator();
   while(it.hasNext()){
    FileItem fileItem = (FileItem) it.next();
    if(fileItem.isFormField()){     
     System.out.println(fileItem.getFieldName() + "   " + fileItem.getName() + "   " + new String(fileItem.getString().getBytes("iso8859-1"), "gbk"));
    }else{
     System.out.println(fileItem.getFieldName() + "   " +
        fileItem.getName() + "   " +
        fileItem.isInMemory() + "    " +
        fileItem.getContentType() + "   " +
        fileItem.getSize());
    
     if(fileItem.getName()!=null && fileItem.getSize()!=0){
      File fullFile = new File(fileItem.getName());
      File newFile = new File("c:/temp/" + fullFile.getName());
      try {
       fileItem.write(newFile);
      } catch (Exception e) {
       e.printStackTrace();
      }
     }else{
      System.out.println("文件没有选择 或 文件内容为空");
     }
    }
    
   }
  }
}

}

MultipartTestServlet2.java

package com.bug.servlet;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

public class MultipartTestServlet2 extends HttpServlet {

public MultipartTestServlet2() {
  super();
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {

  //request.setCharacterEncoding("gbk");  不起作用
  System.out.println("start ");
  MultipartRequest multi = new MultipartRequest(request, "c:/tmp/", 2*1024*1024, "gbk", new DefaultFileRenamePolicy());
  System.out.println("start ");
  Enumeration filesName = multi.getFileNames();
  Enumeration paramsName = multi.getParameterNames();
  while(paramsName.hasMoreElements()){
   String paramName = (String) paramsName.nextElement();
   System.out.println(multi.getParameter(paramName));
  }
  while(filesName.hasMoreElements()){
   String fileName = (String) filesName.nextElement();
   System.out.println(multi.getFilesystemName(fileName) + "  " +
          multi.getOriginalFileName(fileName) + "  " +
          multi.getContentType(fileName) + "  ");
   if(multi.getFilesystemName(fileName)!=null && !multi.getFilesystemName(fileName).equals(""))
    System.out.println(multi.getFile(fileName).toURI());
  }
}

}

MultipartTestServlet3.java

package com.bug.servlet;

import java.io.File;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.oreilly.servlet.multipart.FilePart;
import com.oreilly.servlet.multipart.MultipartParser;
import com.oreilly.servlet.multipart.ParamPart;
import com.oreilly.servlet.multipart.Part;

public class MultipartTestServlet3 extends HttpServlet {

public MultipartTestServlet3() {
  super();
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {

      MultipartParser mp = new MultipartParser(request, 2*1024*1024, false, false, "gbk");
      Part part;
      while ((part = mp.readNextPart()) != null) {
        String name = part.getName();
        if (part.isParam()) {
          ParamPart paramPart = (ParamPart) part;
          String value = paramPart.getStringValue();
          System.out.println("param: name=" + name + "; value=" + value);
        }
        else if (part.isFile()) {
          // it's a file part
          FilePart filePart = (FilePart) part;
          String fileName = filePart.getFileName();
          if (fileName != null) {
            long size = filePart.writeTo(new File("c:/tmp/"));
            System.out.println("file: name=" + name + "; fileName=" + fileName +
              ", filePath=" + filePart.getFilePath() +
              ", contentType=" + filePart.getContentType() +
              ", size=" + size);
          }
          else {
           System.out.println("file: name=" + name + "; EMPTY");
          }
          System.out.flush();
        }
      }
    }

}

web.xml中加入

<servlet>
    <servlet-name>MultipartTestServlet</servlet-name>
    <servlet-class>com.bug.servlet.MultipartTestServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>MultipartTestServlet2</servlet-name>
    <servlet-class>com.bug.servlet.MultipartTestServlet2</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>MultipartTestServlet3</servlet-name>
    <servlet-class>com.bug.servlet.MultipartTestServlet3</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>MultipartTestServlet</servlet-name>
    <url-pattern>/MultipartTestServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>MultipartTestServlet2</servlet-name>
    <url-pattern>/MultipartTestServlet2</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>MultipartTestServlet3</servlet-name>
    <url-pattern>/MultipartTestServlet3</url-pattern>
  </servlet-mapping>

问题1、中文问题:
三种凡是都可以通过自己的方法来设置encoding为gbk开处理和解决中文问题,包括初始化的时候传入gbk作为参数,或是是初始化后通过setEncoding的方式来实现。
另外ServletFileUpload方式也可以通过request.setCharacterEncoding("gbk");的方式来实现,而其它两种方式不支持这种方式。


问题2、文件大小限制
ServletFileUpload方式可以设置文件大小限制,也可以不用设置,例子中的upload.setSizeMax(2000000)就可以注释掉。如果设置upload.setSizeMax(-1),表明不限制上传的大小。文档中没有指明默认的限制的多少,我在不设置的情况下上传了一个9M的东西,可以上传,估计默认是不限制大小的。
而MultipartRequest方式和MultipartParser方式是必须设置文件的上传文件的大小限制的,如果不设置,默认是1M的大小限制。


问题3、文件上传发生错误
如果文件上传过程中发生任何错误,或者是文件的大小超出了范围,系统都将抛出错误。
ServletFileUpload方式在upload.parseRequest(request)时抛出错误
MultipartRequest方式在new MultipartRequest(。。。)时抛出错误
MultipartParser方式在new MultipartParser(。。。)时抛出错误


问题4、上传同名文件时,他们保存到临时目录是的冲突问题
ServletFileUpload方式,不会有冲突,系统会把上传得文件按照一定的规则重新命名,保证不会冲突
MultipartParser方式,会产生冲突,系统会把文件按照上传时的文件名,保存到临时目录下,如果两个用会同时上传文件名相同的文件,那么就可能会产生冲突,一方把另一方的临时文件给替换了。
MultipartRequest方式,在初始化时如果提供了一个名称转换策略,就不会有冲突,如果不提桶,就会有冲突。在上面的例子中我们提供了一个new DefaultFileRenamePolicy()保证了文件名不会有冲突发生。


问题5:表单中有两个同名的文件上传选择框,就像我们例子中的myfile一样,每个表单中有两个name=“myfile”的上传框
ServletFileUpload方式,可以处理,可以分别得到他们各自的文件,
MultipartRequest方式,不可以处理,会发生冲突,会有一个上传框的文件覆盖了另外一个。
MultipartParser方式,可以处理,可以分别得到他们各自的文件,


备注:
代码比较乱,主要是为了说明他们间的区别。他们的详细地使用说明还是要参考他的javadoc和domo。

参考:
1、http://www.servlets.com/cos/#classes
2、http://jakarta.apache.org/commons/fileupload/apidocs/index.html
3、http://jakarta.apache.org/commons/fileupload/using.html
4、http://www.onjava.com/pub/a/onjava/2003/06/25/commons.html?page=3

分享到:
评论
2 楼 高级java工程师 2012-03-11  
http上传最大2G,大小自己控制
1 楼 luanc 2012-02-15  
请问一下,这段上传代码中,设置的文件大小,最大可以设置多大?

相关推荐

    java上传下载实例

    总的来说,这个Java上传下载实例是一个很好的学习资源,它涵盖了Web开发中的核心技能,包括文件I/O、HTTP协议、MVC框架的使用以及安全策略等。通过这个实例,开发者能够深化对Web服务端编程的理解,并提升实际项目...

    java文件上传实例

    在这个“java文件上传实例”中,我们将深入探讨如何实现这一功能,并结合拦截器来增强上传的安全性和可控性。文件上传的流程通常包括前端页面的构建、后端接口的设计以及中间件的处理,而拦截器则可以用来进行权限...

    java上传文件实例

    &lt;%@ page language="java" import="java.util.*" pageEncoding="GBK"%&gt; ;charset=gb2312" language="java" import="java.io.*,java.awt.Image,java.awt.image.*,com.sun.image.codec.jpeg.*,java.sql.*,...

    flash java 上传头像实例

    在IT行业中,开发一个“Flash Java上传头像实例”涉及到前端与后端的协同工作,主要利用Adobe Flash作为用户界面,结合Java服务器端技术来处理文件上传。这个实例旨在为用户提供一个简单易用的头像更换功能。下面将...

    Java简单上传图片实例

    总结来说,这个Java图片上传实例主要涉及以下知识点: 1. Struts框架的Action配置和执行机制。 2. 使用`File`对象接收上传的文件。 3. 处理文件上传的业务逻辑,包括文件的保存和异常处理。 4. HTML表单的创建,...

    文件上传实例-JAVA

    以下是关于这个"文件上传实例-JAVA"的详细解释和相关知识点。 1. **文件上传的基本原理**: 文件上传通常涉及客户端(浏览器)与服务器之间的交互。用户在Web表单中选择文件,表单提交后,文件数据被封装到HTTP...

    Flex+Java、PHP 批量上传实例文档

    Flex+Java、PHP 批量上传实例文档Flex+Java、PHP 批量上传实例文档Flex+Java、PHP 批量上传实例文档Flex+Java、PHP 批量上传实例文档Flex+Java、PHP 批量上传实例文档Flex+Java、PHP 批量上传实例文档Flex+Java、...

    Java上传下载实例

    这个"Java上传下载实例"提供了一个基础模板,适用于初学者学习如何在JSP(Java Server Pages)环境中实现这些功能。 首先,我们需要理解上传和下载的基本概念。上传通常指的是用户通过网页将本地文件发送到服务器的...

    Java 批量上传文件实例

    综上所述,Java批量上传文件实例涉及到的关键技术包括:HTML5多文件选择、Multipart HTTP请求、Commons-FileUpload库的使用以及Servlet的文件处理。在实际开发中,还需要结合具体业务需求,进行安全性和性能优化。

    Java 文件上传的实例详解

    "Java 文件上传的实例详解" Java 文件上传是指在 Java 应用程序中实现文件上传功能的过程。文件上传是 Web 应用程序中非常常见的功能,例如上传头像、上传附件、上传图片等。Java 文件上传可以使用多种方法实现,...

    上传图片实例 JAVA

    这个“上传图片实例JAVA”的主题主要涵盖了如何在Java环境中实现图片的上传、处理和存储。下面将详细介绍这个过程,并提供相关的知识点。 首先,我们需要一个表单(HTML)来让用户选择并提交图片文件。表单应包含一...

    Java文件上传下载实例(含详细注释)

    以下是关于"Java文件上传下载实例(含详细注释)"的详细知识点解析: 1. **Servlet与JSP**: - Java文件上传通常涉及到Servlet技术,Servlet是Java为HTTP协议提供的一种服务端接口,用于处理客户端(浏览器)的请求...

    Java上传视频实例代码

    Java上传视频实例代码 Java上传视频实例代码是使用Java语言编写的视频上传功能实例代码,代码分为页面前台和后台两个部分。前台代码使用HTML、CSS和JavaScript编写,负责视频文件的上传和表单提交;后台代码使用...

    flex+java文件上传完整实例

    本示例“flex+java文件上传完整实例”提供了一个完善的解决方案,它结合了Adobe Flex前端技术和Java后端技术,实现了用户友好的文件上传功能。Flex是一种开源的RIA(富互联网应用)开发框架,而Java则提供了强大的...

    通过java向fastdfs上传文件实例

    本文将详细讲解如何通过Java开发语言来实现向FastDFS系统的文件上传功能。 FastDFS是一个高性能、轻量级的分布式文件系统,它对文件进行管理,包括文件存储、文件同步、文件访问(文件上传、文件下载)等功能,解决...

    java文件的上传和下载完整实例

    java文件的上传和下载完整实例,前断时间一直对上传和下载不是很明白,然后这段时间本人亲自整理资料并对上传和下载写了一个完整的项目,项目是maven+springmvc实现的,本人亲自测试过决对可以用,如果下载下来不能...

    Java 文件上传实例

    本文将深入探讨Java实现文件上传的基本步骤、关键技术和相关工具,结合提供的资源,我们将一起学习一个实际的Java文件上传实例。 首先,我们要理解文件上传的基本流程。在Web应用中,文件上传通常涉及客户端(通常...

    Java文件上传实例

    本实例将深入探讨如何在Java环境中实现这一功能。 首先,我们需要了解HTTP协议中的multipart/form-data编码类型,这是在Web表单中上传文件的标准方式。当用户选择一个或多个文件并提交表单时,这些文件将以二进制...

    java源码包---java 源码 大量 实例

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

Global site tag (gtag.js) - Google Analytics