servlet实现多文件上传

1.fileupload.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
<% 
     String path = request.getContextPath(); 
     String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 
%> 
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
<head> 
 <base href="<%=basePath%>">     
 <title>My JSP 'fileupload.jsp' starting page</title>  
    <meta http-equiv="pragma" content="no-cache"> 
    <meta http-equiv="cache-control" content="no-cache"> 
    <meta http-equiv="expires" content="0">     
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
   <meta http-equiv="description" content="This is my page"> 
  </head> 
  
  <body> 
     <!-- enctype 默认是 application/x-www-form-urlencoded --> 
     <form action="FileUpLoad" enctype="multipart/form-data" method="post" > 
               用户名:<input type="text" name="usename"> <br/> 
               上传文件:<input type="file" name="file1"><br/> 
            上传文件: <input type="file" name="file2"><br/> 
              <input type="submit" value="提交"/>  
     </form>  
  </body> 
</html> 

 2.实际处理文件上传的 FileUpLoad.java

package com.servlet.fileupload; 
   import java.io.File; 
   import java.io.*; 
   import java.io.IOException; 
   import java.io.PrintWriter;  
   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.FileUploadException; 

   import org.apache.commons.fileupload.disk.DiskFileItemFactory; 
   import org.apache.commons.fileupload.servlet.ServletFileUpload; 

   
public class FileUpLoad extends HttpServlet {  

    public void doPost(HttpServletRequest request, HttpServletResponse response)  
         throws ServletException, IOException {  
        
       request.setCharacterEncoding("utf-8");  //设置编码  
        
     //获得磁盘文件条目工厂  
      DiskFileItemFactory factory = new DiskFileItemFactory();  
       //获取文件需要上传到的路径  
      String path = this.getServletContext().getRealPath("/upload");
        factory.setRepository(new File(path));  
        //设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室  
        factory.setSizeThreshold(1024*1024) ;  
          
        //高水平的API文件上传处理  
        ServletFileUpload upload = new ServletFileUpload(factory);    
        try {  
            //可以上传多个文件  
           List<FileItem> list =upload.parseRequest(request);  
              
          for(FileItem item : list)  
            {  
                //获取表单的属性名字  
                String name = item.getFieldName();  
                 
              //如果获取的 表单信息是普通的 文本 信息  
                if(item.isFormField())  
                {                     
                    //获取用户具体输入的字符串 ,名字起得挺好,因为表单提交过来的是 字符串类型的  
                    String value = item.getString() ;  
                      
                    request.setAttribute(name, value);  
                }  
               //对传入的非 简单的字符串进行处理 ,比如说二进制的 图片,电影这些  
                else  
              {  
                    /** 
                     * 以下三步,主要获取 上传文件的名字 
                    */  
                    //获取路径名  
                   String value = item.getName() ;  
                    //索引到最后一个反斜杠  
                    int start = value.lastIndexOf("\\");  
                   //截取 上传文件的 字符串名字,加1是 去掉反斜杠,  
                   String filename = value.substring(start+1);  
                   request.setAttribute(name, filename);  
                     
                   //真正写到磁盘上  
               

                  OutputStream out = new FileOutputStream(new File(path,filename));  
                  InputStream in = item.getInputStream() ;  
                     
                 int length = 0 ;  
                 byte [] buf = new byte[1024] ;  
                    
               System.out.println("获取上传文件的总共的容量:"+item.getSize());  

                   // in.read(buf) 每次读到的数据存放在   buf 数组中  
                 while( (length = in.read(buf) ) != -1)  
                  {  
                       //在   buf 数组中 取出数据 写到 (输出流)磁盘上  
                     out.write(buf, 0, length);  
                         
                   }  
                     
                 in.close();  
                  out.close();  
               }  
      }  
            
} catch (FileUploadException e) {  
           // TODO Auto-generated catch block  
          e.printStackTrace();  
       }  
catch (Exception e) {  
          e.printStackTrace();  
}  
        
    request.getRequestDispatcher("filedemo.jsp").forward(request, response);  
        
  } 

 

3.filedemo.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
<% 
    String path = request.getContextPath(); 
   String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 
%> 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html>  
   <head>  
   <base href="<%=basePath%>">  
     
    <title>My JSP 'filedemo.jsp' starting page</title>  
      
    <meta http-equiv="pragma" content="no-cache">  
    <meta http-equiv="cache-control" content="no-cache">  
    <meta http-equiv="expires" content="0">      
   <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
    <meta http-equiv="description" content="This is my page">  
    <!-- 
    <link rel="stylesheet" type="text/css" href="styles.css"> 
    -->  
 
  </head>  
    
<body>  
    用户名:${requestScope.usename } <br/>  
    文件:${requestScope.file1 }<br/>  
    ${requestScope.file2 }<br/>  
   <!-- 把上传的图片显示出来 -->  
    <img alt="go" src="upload/<%=(String)request.getAttribute("file1")%> " />  
   
 </body> 
</html>

你可能感兴趣的:(servlet)