zoukankan      html  css  js  c++  java
  • Servlet实现文件上传,可多文件上传

    一、Servlet实现文件上传,需要添加第三方提供的jar包

    接着把这两个jar包放到 lib文件夹下:

    二:

    文件上传的表单提交方式必须是POST方式,

    编码类型:enctype="multipart/form-data",默认是 application/x-www-form-urlencoded

    比如:<form action="FileUpLoad"enctype="multipart/form-data"method="post">

    三、举例:

    1.fileupload.jsp

    [html] view plain copy
    1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
    2. <%  
    3. String path = request.getContextPath();  
    4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
    5. %>  
    6.   
    7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    8. <html>  
    9.   <head>  
    10.     <base href="<%=basePath%>">  
    11.       
    12.     <title>My JSP 'fileupload.jsp' starting page</title>  
    13.       
    14.     <meta http-equiv="pragma" content="no-cache">  
    15.     <meta http-equiv="cache-control" content="no-cache">  
    16.     <meta http-equiv="expires" content="0">      
    17.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
    18.     <meta http-equiv="description" content="This is my page">  
    19.     <!-- 
    20.     <link rel="stylesheet" type="text/css" href="styles.css"> 
    21.     -->  
    22.   
    23.   </head>  
    24.     
    25.   <body>  
    26.      <!-- enctype 默认是 application/x-www-form-urlencoded -->  
    27.      <form action="FileUpLoad" enctype="multipart/form-data" method="post" >  
    28.           
    29.                用户名:<input type="text" name="usename"<br/>  
    30.                上传文件:<input type="file" name="file1"><br/>  
    31.               上传文件: <input type="file" name="file2"><br/>  
    32.               <input type="submit" value="提交"/>  
    33.        
    34.      </form>  
    35.        
    36.        
    37.        
    38.   </body>  
    39. </html>  


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

    [java] view plain copy
    1. package com.servlet.fileupload;  
    2.   
    3. import java.io.File;  
    4. import java.io.*;  
    5. import java.io.IOException;  
    6. import java.io.PrintWriter;  
    7. import java.util.List;  
    8.   
    9. import javax.servlet.ServletException;  
    10. import javax.servlet.http.HttpServlet;  
    11. import javax.servlet.http.HttpServletRequest;  
    12. import javax.servlet.http.HttpServletResponse;  
    13.   
    14. import org.apache.commons.fileupload.FileItem;  
    15. import org.apache.commons.fileupload.FileUploadException;  
    16. import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
    17. import org.apache.commons.fileupload.servlet.ServletFileUpload;  
    18.   
    19. /** 
    20.  *  
    21.  * @author Administrator 
    22.  * 文件上传 
    23.  * 具体步骤: 
    24.  * 1)获得磁盘文件条目工厂 DiskFileItemFactory 要导包 
    25.  * 2) 利用 request 获取 真实路径 ,供临时文件存储,和 最终文件存储 ,这两个存储位置可不同,也可相同 
    26.  * 3)对 DiskFileItemFactory 对象设置一些 属性 
    27.  * 4)高水平的API文件上传处理  ServletFileUpload upload = new ServletFileUpload(factory); 
    28.  * 目的是调用 parseRequest(request)方法  获得 FileItem 集合list , 
    29.  *      
    30.  * 5)在 FileItem 对象中 获取信息,   遍历, 判断 表单提交过来的信息 是否是 普通文本信息  另做处理 
    31.  * 6) 
    32.  *    第一种. 用第三方 提供的  item.write( new File(path,filename) );  直接写到磁盘上 
    33.  *    第二种. 手动处理   
    34.  * 
    35.  */  
    36. public class FileUpLoad extends HttpServlet {  
    37.   
    38.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
    39.             throws ServletException, IOException {  
    40.           
    41.         request.setCharacterEncoding("utf-8");  //设置编码  
    42.           
    43.         //获得磁盘文件条目工厂  
    44.         DiskFileItemFactory factory = new DiskFileItemFactory();  
    45.         //获取文件需要上传到的路径  
    46.         String path = request.getRealPath("/upload");  
    47.           
    48.         //如果没以下两行设置的话,上传大的 文件 会占用 很多内存,  
    49.         //设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同  
    50.         /** 
    51.          * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上,  
    52.          * 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem 格式的  
    53.          * 然后再将其真正写到 对应目录的硬盘上 
    54.          */  
    55.         factory.setRepository(new File(path));  
    56.         //设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室  
    57.         factory.setSizeThreshold(1024*1024) ;  
    58.           
    59.         //高水平的API文件上传处理  
    60.         ServletFileUpload upload = new ServletFileUpload(factory);  
    61.           
    62.           
    63.         try {  
    64.             //可以上传多个文件  
    65.             List<FileItem> list = (List<FileItem>)upload.parseRequest(request);  
    66.               
    67.             for(FileItem item : list)  
    68.             {  
    69.                 //获取表单的属性名字  
    70.                 String name = item.getFieldName();  
    71.                   
    72.                 //如果获取的 表单信息是普通的 文本 信息  
    73.                 if(item.isFormField())  
    74.                 {                     
    75.                     //获取用户具体输入的字符串 ,名字起得挺好,因为表单提交过来的是 字符串类型的  
    76.                     String value = item.getString() ;  
    77.                       
    78.                     request.setAttribute(name, value);  
    79.                 }  
    80.                 //对传入的非 简单的字符串进行处理 ,比如说二进制的 图片,电影这些  
    81.                 else  
    82.                 {  
    83.                     /** 
    84.                      * 以下三步,主要获取 上传文件的名字 
    85.                      */  
    86.                     //获取路径名  
    87.                     String value = item.getName() ;  
    88.                     //索引到最后一个反斜杠  
    89.                     int start = value.lastIndexOf("\");  
    90.                     //截取 上传文件的 字符串名字,加1是 去掉反斜杠,  
    91.                     String filename = value.substring(start+1);  
    92.                       
    93.                     request.setAttribute(name, filename);  
    94.                       
    95.                     //真正写到磁盘上  
    96.                     //它抛出的异常 用exception 捕捉  
    97.                       
    98.                     //item.write( new File(path,filename) );//第三方提供的  
    99.                       
    100.                     //手动写的  
    101.                     OutputStream out = new FileOutputStream(new File(path,filename));  
    102.                       
    103.                     InputStream in = item.getInputStream() ;  
    104.                       
    105.                     int length = 0 ;  
    106.                     byte [] buf = new byte[1024] ;  
    107.                       
    108.                     System.out.println("获取上传文件的总共的容量:"+item.getSize());  
    109.   
    110.                     // in.read(buf) 每次读到的数据存放在   buf 数组中  
    111.                     while( (length = in.read(buf) ) != -1)  
    112.                     {  
    113.                         //在   buf 数组中 取出数据 写到 (输出流)磁盘上  
    114.                         out.write(buf, 0, length);  
    115.                           
    116.                     }  
    117.                       
    118.                     in.close();  
    119.                     out.close();  
    120.                 }  
    121.             }  
    122.               
    123.               
    124.               
    125.         } catch (FileUploadException e) {  
    126.             // TODO Auto-generated catch block  
    127.             e.printStackTrace();  
    128.         }  
    129.         catch (Exception e) {  
    130.             // TODO Auto-generated catch block  
    131.               
    132.             //e.printStackTrace();  
    133.         }  
    134.           
    135.           
    136.         request.getRequestDispatcher("filedemo.jsp").forward(request, response);  
    137.           
    138.   
    139.     }  
    140.   
    141. }  

    System.out.println("获取上传文件的总共的容量:"+item.getSize()); 

    3.filedemo.jsp

    [html] view plain copy
    1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
    2. <%  
    3. String path = request.getContextPath();  
    4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
    5. %>  
    6.   
    7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    8. <html>  
    9.   <head>  
    10.     <base href="<%=basePath%>">  
    11.       
    12.     <title>My JSP 'filedemo.jsp' starting page</title>  
    13.       
    14.     <meta http-equiv="pragma" content="no-cache">  
    15.     <meta http-equiv="cache-control" content="no-cache">  
    16.     <meta http-equiv="expires" content="0">      
    17.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
    18.     <meta http-equiv="description" content="This is my page">  
    19.     <!-- 
    20.     <link rel="stylesheet" type="text/css" href="styles.css"> 
    21.     -->  
    22.   
    23.   </head>  
    24.     
    25.   <body>  
    26.       
    27.     用户名:${requestScope.usename } <br/>  
    28.     文件:${requestScope.file1 }<br/>  
    29.     ${requestScope.file2 }<br/>  
    30.     <!-- 把上传的图片显示出来 -->  
    31.     <img alt="go" src="upload/<%=(String)request.getAttribute("file1")%> " />  
    32.       
    33.       
    34.       
    35.   </body>  
    36. </html>  


    4结果页面:

  • 相关阅读:
    js判断是否为数字
    sublime3常用插件总结
    npm run build打包后自定义动画没有执行
    css实现未知元素宽高垂直居中和水平居中的方法
    vue3.0的设计目标
    chrome 80版本以后开启了SameSite
    http以及缓存、事件循环......
    vue移动端适配就这么玩
    前端性能监控
    能解决 80% 需求的 10个 CSS动画库
  • 原文地址:https://www.cnblogs.com/hoobey/p/5294313.html
Copyright © 2011-2022 走看看