`

使用commons-fileupload上传文件

    博客分类:
  • JEE
阅读更多
import java.io.*;
import java.util.*;
import javax.servlet.ServletException;
import javax.servlet.http.*
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class FileUploadServlet extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    doPost(request, response);
  }

  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    final long MAX_SIZE = 3 * 1024 * 1024;// 设置上传文件最大为 3M
    // 允许上传的文件格式的列表
    final String[] allowedExt = new String[] { "jpg", "jpeg", "gif", "txt",
        "doc", "docx", "mp3", "wma", "m4a" };
    response.setContentType("text/html");
    // 设置字符编码为UTF-8, 这样支持汉字显示
    response.setCharacterEncoding("UTF-8");
    
    
    // 实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload
    DiskFileItemFactory dfif = new DiskFileItemFactory();
    // 设置上传文件时用于临时存放文件的内存大小,这里是4K.多于的部分将临时存在硬盘
    dfif.setSizeThreshold(4096);
    // 设置存放临时文件的目录,web根目录下的ImagesUploadTemp目录
    dfif.setRepository(new File(request.getSession().getServletContext()
      .getRealPath("/") + "ImagesUploadTemp"));
    
    // 用以上工厂实例化上传组件
    ServletFileUpload sfu = new ServletFileUpload(dfif);
    // 设置最大上传尺寸
    sfu.setSizeMax(MAX_SIZE);
    PrintWriter out = response.getWriter();
    // 从request得到 所有 上传域的列表
    List fileList = null;
    try {
      fileList = sfu.parseRequest(request);
    } catch (FileUploadException e) {// 处理文件尺寸过大异常
      if (e instanceof SizeLimitExceededException) {
        out.println("文件尺寸超过规定大小:" + MAX_SIZE + "字节<p />");
        out.println("<a href=\"upload.html\" target=\"_top\">返回</a>");
        return;
      }
      e.printStackTrace();
    }
    // 没有文件上传
    if (fileList == null || fileList.size() == 0) {
      out.println("请选择上传文件<p />");
      out.println("<a href=\"upload.html\" target=\"_top\">返回</a>");
      return;
    }
    
    // 得到所有上传的文件
    Iterator it = fileList.iterator();
    // 循环处理所有文件
    while (it.hasNext()) {
      FileItem fileItem = null;
      String path = null;
      long size = 0;
      // 得到当前文件
      fileItem = (FileItem) it.next();
      // 忽略简单form字段而不是上传域的文件域(<input type="text" />等)
      if (fileItem == null || fileItem.isFormField()) {
        continue;
      }
      // 得到文件的完整路径
      path = fileItem.getName();
      // 得到文件的大小
      size = fileItem.getSize();
      if ("".equals(path) || size == 0) {
        out.println("请选择上传文件<p />");
        out.println("<a href=\"upload.html\" target=\"_top\">返回</a>");
        return;
      }
      // 得到去除路径的文件名
      String t_name = path.substring(path.lastIndexOf("\\") + 1);
      // 得到文件的扩展名(无扩展名时将得到全名)
      String t_ext = t_name.substring(t_name.lastIndexOf(".") + 1);
      // 拒绝接受规定文件格式之外的文件类型
      int allowFlag = 0;
      int allowedExtCount = allowedExt.length;
      for (; allowFlag < allowedExtCount; allowFlag++) {
        if (allowedExt[allowFlag].equals(t_ext))
          break;
      }
      if (allowFlag == allowedExtCount) {
        out.println("请上传以下类型的文件<p />");
        for (allowFlag = 0; allowFlag < allowedExtCount; allowFlag++)
          out.println("*." + allowedExt[allowFlag] + "&nbsp;&nbsp;&nbsp;");
        out.println("<p /><a href=\"upload.html\" target=\"_top\">返回</a>");
        return;
      }
      
      long now = System.currentTimeMillis();
      // 根据系统时间生成上传后保存的文件名
      String prefix = String.valueOf(now);
      // 保存的最终文件完整路径,保存在web根目录下的ImagesUploaded目录下
      String u_name = request.getSession().getServletContext()
        .getRealPath("/") + "ImagesUploaded/" + prefix + "." + t_ext;
      try {
        // 保存文件
        fileItem.write(new File(u_name));
        out.println("文件上传成功. 已保存为: " + prefix + "." + t_ext
            + " &nbsp;&nbsp;文件大小: " + size + "字节<p />");
        out.println("<a href=\"upload.html\" target=\"_top\">继续上传</a>");
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
}


页面
<html>
  <head>
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
    <title>Untitled</title>
  </head>

  <body>
    <form action="FileUploadServlet" method="post"
      enctype="multipart/form-data">
      <input type="text" value="xxx"/> <br />
      <input type="file" size="30" name="test" /><br />
      <input name="up" type="submit" value="上传" />
    </form>
  </body>
</html>



web.xml文件中的配置
  <servlet>
  <servlet-name>FileUploadServlet</servlet-name>
  <servlet-class>FileUploadServlet</servlet-class>
  </servlet>

  <servlet-mapping>
  <servlet-name>FileUploadServlet</servlet-name>
  <url-pattern>/FileUploadServlet</url-pattern>
  </servlet-mapping>

分享到:
评论

相关推荐

    commons-fileupload-1.3.3&commons-fileupload-1.3.3架包和代码.rar

    Apache Commons FileUpload是一个Java库,专门用于处理HTTP协议中的多部分文件上传请求。在Web应用程序中,它允许用户上传文件到服务器,这对于处理用户提交的图片、文档或其他类型的数据至关重要。 描述中提及的...

    commons-fileupload-1.3.3.jar和commons-io-2.6.jar

    在Java开发中,上传文件是一项常见的任务,而`commons-fileupload-1.3.3.jar`和`commons-io-2.6.jar`是Apache Commons项目中的两个重要库,专门用于处理HTTP请求中的文件上传功能。这两个库为开发者提供了便捷、高效...

    commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar jar 文件

    commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar jar 文件。 commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar 案例上传: http://hi.baidu.com/lichao77821/blog commons-fileupload-1.2.1.jar和commons-...

    commons-fileupload组件上传问题

    通过阅读这篇博客,开发者可以更好地理解如何在Java Web应用中使用`commons-fileupload`组件实现安全、高效的文件上传功能。 总结起来,`commons-fileupload`组件是处理HTTP文件上传的利器,它简化了文件上传的流程...

    commons-fileupload 文件上传 图片上传 demo

    至于文件列表中提到的"Roger",这可能是实际的项目文件或代码示例,具体内容没有给出,但根据标题“demo”可以推测,这可能是一个演示如何使用`commons-fileupload`进行图片上传的Java代码示例。 在实际应用中,...

    commons-fileupload实现文件上传下载

    本文将详细介绍如何使用 Commons-FileUpload 实现文件的上传和下载功能。 #### 一、环境搭建与依赖引入 1. **Maven 依赖**: - 在项目的 `pom.xml` 文件中添加 Commons-FileUpload 和 Commons-Io 的依赖。 ```...

    commons-fileupload-1.3.3.jar commons-io-2.5.jar

    `commons-fileupload-1.3.3.jar` 和 `commons-io-2.5.jar` 是Apache Commons项目中的两个重要库,它们提供了强大的文件上传功能,使得开发者可以轻松地处理用户通过表单提交的文件。 Apache Commons FileUpload是...

    commons-fileupload-1.3.jar和commons-io-1.2.jar.zip

    Apache Commons FileUpload和Commons IO是两个非常重要的库,它们为Java提供了强大的文件上传和处理能力。在这个场景中,我们关注的是"commons-fileupload-1.3.jar"和"commons-io-1.2.jar"这两个文件,它们被打包在...

    文件上传两个jar包commons-fileupload-1.3.1和commons-io-2.4

    这段代码展示了如何使用`commons-fileupload`解析请求并保存上传的文件。通过`item.write()`方法,我们可以将文件内容写入服务器指定的位置,这里使用了`commons-io`的写入功能。 总的来说,`commons-fileupload-...

    commons-fileupload.rar;包括commons-fileupload-1.3.1-bin和commons-io-2.4

    6. **安全性考虑**:在使用`commons-fileupload`进行文件上传时,需要考虑安全性问题,比如防止恶意文件上传、限制文件大小和类型、以及对上传文件的路径安全控制,防止路径遍历攻击。 7. **与其他库的集成**:`...

    commons-fileupload-1.2.1.jar与commons-io-1.3.2.jar

    在处理文件上传时,`commons-fileupload`可能会依赖`commons-io`来完成一些底层的文件操作,比如读写文件、复制文件、检查文件是否存在等。`1.3.2`同样表示这个库的一个特定版本,它可能包含了更多的功能和改进。 ...

    commons-fileupload及源码

    Apache Commons FileUpload是一个Java库,专门用于处理HTTP...通过结合使用`commons-fileupload-1.3.1.jar`和`commons-fileupload-1.3.1-sources.jar`,开发者可以轻松地在自己的项目中实现安全、高效的文件上传功能。

    commons-fileupload.jar和commons-io.jar

    使用FileUpload,你可以轻松地获取到上传文件的内容,并将其保存到服务器的指定位置。以下是一些核心类和方法: 1. ` DiskFileItemFactory `:工厂类,用于创建`FileItem`对象,管理临时文件存储。 2. `...

    commons-fileupload-1.2.jar和commons-io-1.3.2.jar

    第1个上传组件commons-fileupload =============commons-fileupload ================ common-fileupload组件是apache的一个开源项目之一,可以从http://jakarta.apache.org/commons/fileupload/下载。该组件简单...

    commons-fileupload-1.3.2.jar和commons-io-2.5.jar

    在使用`commons-fileupload-1.3.2.jar`处理文件上传时,通常会配合`commons-io-2.5.jar`来完成一些辅助操作,例如读取上传文件的内容、检查文件类型、移动文件到目标位置等。通过这两个库的组合,开发者能够方便地在...

    struts1.2和commons-fileupload实现文件上传

    总结来说,Struts1.2与Commons-Fileupload的结合使用,提供了一个简单而有效的文件上传解决方案。然而,这只是一个基本的实现,实际项目中可能还需要处理更多细节,比如错误处理、异常捕获、文件重命名策略、存储...

    commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar

    Apache Commons FileUpload与Apache Commons IO是Java开发中处理文件上传的两个重要库。它们为开发者提供了强大而灵活的工具,使得在Web应用中处理文件上传变得简单易行。 `commons-fileupload-1.2.1.jar`是Apache ...

    commons-fileupload-1.2.1.jar 和commons-io-1.4.jar

    Apache Commons FileUpload与Apache Commons IO是Java开发中处理文件上传的两个重要库,它们在Web应用中被广泛使用。这两个库分别提供了不同的功能,但在处理文件上传时常常一起使用。 `commons-fileupload-1.2.1....

    commons-fileupload-1.2.2.jar和commons-io-2.4.jar包

    在与FileUpload库配合使用时,IO库可以方便地进行文件的读写和临时存储,确保文件上传过程的稳定性和安全性。 这两个库的协同工作流程大致如下: 1. **接收请求**:服务器端接收到带有文件的HTTP请求,请求内容...

Global site tag (gtag.js) - Google Analytics