Servlet中的文件上传

本文介绍如何使用Apache Commons FileUpload库实现文件上传功能,包括初始化配置、检查是否为文件上传请求、解析请求获取文件项并进行相应处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上传表单中的注意事项:

表单 method 属性应该设置为 POST 方法,不能使用 GET 方法

表单 enctype 属性应该设置为multipart/form-data

下面的实例是借助于commons-fileupload和commons-io相关包来实现的

  1. importjava.io.*; 
  2. import java.util.*; 
  3.   
  4. importjavax.servlet.ServletConfig; 
  5. importjavax.servlet.ServletException; 
  6. importjavax.servlet.http.HttpServlet; 
  7. importjavax.servlet.http.HttpServletRequest;
  8. importjavax.servlet.http.HttpServletResponse;
  9.   
  10. importorg.apache.commons.fileupload.FileItem; 
  11. importorg.apache.commons.fileupload.FileUploadException; 
  12. importorg.apache.commons.fileupload.disk.DiskFileItemFactory; 
  13. importorg.apache.commons.fileupload.servlet.ServletFileUpload;
  14. importorg.apache.commons.io.output.*; 
  15.   
  16. public class UploadServletextends HttpServlet { 
  17.    
  18.    private boolean isMultipart; 
  19.    private String filePath; 
  20.    private int maxFileSize = 50 * 1024
  21.    private int maxMemSize = 4 * 1024
  22.    private File file ; 
  23.   
  24.    public void init( ){ 
  25.       // 获取文件将被存储的位置 
  26.       filePath = 
  27.             getServletContext().getInitParameter("file-upload"); 
  28.    } 
  29.    public void doPost(HttpServletRequestrequest, 
  30.                HttpServletResponse response) 
  31.               throws ServletException,java.io.IOException { 
  32.       // 检查我们有一个文件上传请求 
  33.       isMultipart = ServletFileUpload.isMultipartContent(request); 
  34.      response.setContentType("text/html"); 
  35.       java.io.PrintWriter out =response.getWriter( ); 
  36.       if( !isMultipart ){ 
  37.          out.println("<html>"); 
  38.          out.println("<head>"); 
  39.          out.println("<title>Servletupload</title>");  
  40.         out.println("</head>"); 
  41.          out.println("<body>"); 
  42.          out.println("<p>No fileuploaded</p>"); 
  43.         out.println("</body>"); 
  44.         out.println("</html>"); 
  45.          return
  46.       } 
  47.       DiskFileItemFactoryfactory = new DiskFileItemFactory(); 
  48.       //设置上传文件时用于临时存放文件的内存大小 
  49.       factory.setSizeThreshold(maxMemSize); 
  50.       //设置存放临时文件的目录,这个目录需要事先建立好 
  51.       factory.setRepository(new File("c:\\temp")); 
  52.   
  53.       // 创建一个新的文件上传处理程序 
  54.       ServletFileUploadupload = new ServletFileUpload(factory); 
  55.       // 允许上传的文件大小的最大值 
  56.       upload.setSizeMax( maxFileSize ); 
  57.   
  58.       try
  59.       // 解析请求,获取文件项 
  60.       List fileItems = upload.parseRequest(request); 
  61.       
  62.       // 处理上传的文件项 
  63.       Iterator i = fileItems.iterator(); 
  64.   
  65.       out.println("<html>"); 
  66.       out.println("<head>"); 
  67.       out.println("<title>Servletupload</title>");  
  68.       out.println("</head>"); 
  69.       out.println("<body>"); 
  70.       while ( i.hasNext () ) 
  71.       { 
  72.          FileItem fi = (FileItem)i.next(); 
  73.          if ( !fi.isFormField () )  //是文件域 
  74.          { 
  75.             // 获取上传文件的参数 
  76.             String fieldName = fi.getFieldName(); 
  77.             String fileName = fi.getName();  //文件的全路径 
  78.             String contentType = fi.getContentType(); 
  79.             boolean isInMemory =fi.isInMemory(); 
  80.             long sizeInBytes = fi.getSize(); 
  81.            //得到去除路径的文件名 
  82.             if(fileName.lastIndexOf("\\") >= 0 ){   //路径中包含“\”时 
  83.                file = new File( filePath + 
  84.                fileName.substring( fileName.lastIndexOf("\\"))); 
  85.             }else{   //路径中不包含“\”时 
  86.                file = new File( filePath + 
  87.               fileName.substring(fileName.lastIndexOf("\\")+1)) ; 
  88.             } 
  89.             fi.write( file ) ;   // 写入文件 
  90.             out.println("UploadedFilename: " + fileName + "<br>"); 
  91.          } 
  92.       } 
  93.       out.println("</body>"); 
  94.       out.println("</html>"); 
  95.    }catch(Exception ex) { 
  96.        System.out.println(ex); 
  97.    } 
  98.    } 
  99.    public void doGet(HttpServletRequestrequest, 
  100.                        HttpServletResponseresponse) 
  101.         throws ServletException,java.io.IOException { 
  102.         
  103.         throw new ServletException("GETmethod used with "
  104.                 getClass( ).getName( )+":POST method required."); 
  105.    } 
importjava.io.*;
import java.util.*;
 
importjavax.servlet.ServletConfig;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
 
importorg.apache.commons.fileupload.FileItem;
importorg.apache.commons.fileupload.FileUploadException;
importorg.apache.commons.fileupload.disk.DiskFileItemFactory;
importorg.apache.commons.fileupload.servlet.ServletFileUpload;
importorg.apache.commons.io.output.*;
 
public class UploadServletextends HttpServlet {
  
   private boolean isMultipart;
   private String filePath;
   private int maxFileSize = 50 * 1024;
   private int maxMemSize = 4 * 1024;
   private File file ;
 
   public void init( ){
      // 获取文件将被存储的位置
      filePath =
            getServletContext().getInitParameter("file-upload");
   }
   public void doPost(HttpServletRequestrequest,
               HttpServletResponse response)
              throws ServletException,java.io.IOException {
      // 检查我们有一个文件上传请求
      isMultipart = ServletFileUpload.isMultipartContent(request);
     response.setContentType("text/html");
      java.io.PrintWriter out =response.getWriter( );
      if( !isMultipart ){
         out.println("<html>");
         out.println("<head>");
         out.println("<title>Servletupload</title>"); 
        out.println("</head>");
         out.println("<body>");
         out.println("<p>No fileuploaded</p>");
        out.println("</body>");
        out.println("</html>");
         return;
      }
      DiskFileItemFactoryfactory = new DiskFileItemFactory();
      //设置上传文件时用于临时存放文件的内存大小
      factory.setSizeThreshold(maxMemSize);
      //设置存放临时文件的目录,这个目录需要事先建立好
      factory.setRepository(new File("c:\\temp"));
 
      // 创建一个新的文件上传处理程序
      ServletFileUploadupload = new ServletFileUpload(factory);
      // 允许上传的文件大小的最大值
      upload.setSizeMax( maxFileSize );
 
      try{
      // 解析请求,获取文件项
      List fileItems = upload.parseRequest(request);
     
      // 处理上传的文件项
      Iterator i = fileItems.iterator();
 
      out.println("<html>");
      out.println("<head>");
      out.println("<title>Servletupload</title>"); 
      out.println("</head>");
      out.println("<body>");
      while ( i.hasNext () )
      {
         FileItem fi = (FileItem)i.next();
         if ( !fi.isFormField () )  //是文件域
         {
            // 获取上传文件的参数
            String fieldName = fi.getFieldName();
            String fileName = fi.getName();  //文件的全路径
            String contentType = fi.getContentType();
            boolean isInMemory =fi.isInMemory();
            long sizeInBytes = fi.getSize();
           //得到去除路径的文件名
            if(fileName.lastIndexOf("\\") >= 0 ){   //路径中包含“\”时
               file = new File( filePath +
               fileName.substring( fileName.lastIndexOf("\\")));
            }else{   //路径中不包含“\”时
               file = new File( filePath +
              fileName.substring(fileName.lastIndexOf("\\")+1)) ;
            }
            fi.write( file ) ;   // 写入文件
            out.println("UploadedFilename: " + fileName + "<br>");
         }
      }
      out.println("</body>");
      out.println("</html>");
   }catch(Exception ex) {
       System.out.println(ex);
   }
   }
   public void doGet(HttpServletRequestrequest,
                       HttpServletResponseresponse)
        throws ServletException,java.io.IOException {
       
        throw new ServletException("GETmethod used with " +
                getClass( ).getName( )+":POST method required.");
   }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值