• Apache Commons fileUpload实现文件上传


        将Apache的commons-fileupload.jar放在应用程序的WEB-INFlib下,即可使用。下面举例介绍如何使用它的文件上传功能。
    所使用的fileUpload版本为1.2,环境为Eclipse3.3+MyEclipse6.0。FileUpload 是基于 Commons IO的,所以在进入项目前先确定Commons IO的jar包(本文使用commons-io-1.3.2.jar)在WEB-INFlib下。
    此文作示例工程可在文章最后的附件中下载。
    示例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);
           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>
        <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);//得到所有的文件
           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>
    <meta http-equiv="Content-Type" content="text/html; charset=GB18030">
    <title>File upload</title>
    </head>
    <body>
    </body>
    </html>
    结果:
    upload succeed
    此时,在"D: emp"下可以看到你上传的两个文件。
    示例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()) {
           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>
    <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")
    public class Upload extends HttpServlet {
        private String uploadPath = "D:\temp"; // 上传文件的目录
        private String tempPath = "d:\temp\buffer\"; // 临时文件目录
        File tempPathFile;
     
        @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>
        <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>
  • 相关阅读:
    前端工程师应该具备的三种思维
    7 个 Bootstrap 在线编辑器用于快速开发响应式网站
    js阻止浏览器的默认行为以及停止事件冒泡(用JQuery实现回车提交)
    JAVASCRIPT加密方法,JS加密解密综述(7种)
    JavaScript生成GUID的方法
    js判断是否为手机访问
    Jquery中parent()和parents()
    jQuery中ajax和post处理json的不同
    JQuery实现回车代替Tab键(按回车跳到下一栏)
    js中replace的用法
  • 原文地址:https://www.cnblogs.com/zlzlzl1993/p/3442152.html
Copyright © 2020-2023  润新知