博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Servlet实现文件上传
阅读量:6871 次
发布时间:2019-06-26

本文共 5192 字,大约阅读时间需要 17 分钟。

hot3.png

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

二:

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

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

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

三、举例

1.fileupload.jsp

  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. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  

  7. <html>  

  8.   <head>  

  9.     <base href="<%=basePath%>">  

  10.     <title>My JSP 'fileupload.jsp' starting page</title>       

  11.     <meta http-equiv="pragma" content="no-cache">  

  12.     <meta http-equiv="cache-control" content="no-cache">  

  13.     <meta http-equiv="expires" content="0">      

  14.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  

  15.     <meta http-equiv="description" content="This is my page">  

  16.   </head>  

  17.   <body>  

  18.      <!-- enctype 默认是 application/x-www-form-urlencoded -->  

  19.      <form action="FileUpLoad" enctype="multipart/form-data" method="post" >  

  20.                用户名:<input type="text" name="usename"> <br/>  

  21.                上传文件:<input type="file" name="file1"><br/>  

  22.               上传文件: <input type="file" name="file2"><br/>  

  23.               <input type="submit" value="提交"/>  

  24.      </form>        

  25.   </body>  

  26. </html>  

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

[java] 

  1. package com.servlet.fileupload;  

  2. import java.io.File;  

  3. import java.io.*;  

  4. import java.io.IOException;  

  5. import java.io.PrintWriter;  

  6. import java.util.List;  

  7. import javax.servlet.ServletException;  

  8. import javax.servlet.http.HttpServlet;  

  9. import javax.servlet.http.HttpServletRequest;  

  10. import javax.servlet.http.HttpServletResponse;  

  11. import org.apache.commons.fileupload.FileItem;  

  12. import org.apache.commons.fileupload.FileUploadException;  

  13. import org.apache.commons.fileupload.disk.DiskFileItemFactory;  

  14. import org.apache.commons.fileupload.servlet.ServletFileUpload;  

  15. /** 

  16.  *  

  17.  * @author Administrator 

  18.  * 文件上传 

  19.  * 具体步骤: 

  20.  * 1)获得磁盘文件条目工厂 DiskFileItemFactory 要导包 

  21.  * 2) 利用 request 获取 真实路径 ,供临时文件存储,和 最终文件存储 ,这两个存储位置可不同,也可相同 

  22.  * 3)对 DiskFileItemFactory 对象设置一些 属性 

  23.  * 4)高水平的API文件上传处理  ServletFileUpload upload = new ServletFileUpload(factory); 

  24.  * 目的是调用 parseRequest(request)方法  获得 FileItem 集合list , 

  25.  * 5)在 FileItem 对象中 获取信息,   遍历, 判断 表单提交过来的信息 是否是 普通文本信息  另做处理 

  26.  * 6) 

  27.  *    第一种. 用第三方 提供的  item.write( new File(path,filename) );  直接写到磁盘上 

  28.  *    第二种. 手动处理   

  29.  */  

  30. public class FileUpLoad extends HttpServlet {  

  31.     public void doPost(HttpServletRequest request, HttpServletResponse response)  

  32.             throws ServletException, IOException {  

  33.         request.setCharacterEncoding("utf-8");  //设置编码  

  34.         //获得磁盘文件条目工厂  

  35.         DiskFileItemFactory factory = new DiskFileItemFactory();  

  36.         //获取文件需要上传到的路径  

  37.         String path = request.getRealPath("/upload");  

  38.         //如果没以下两行设置的话,上传大的 文件 会占用 很多内存,  

  39.         //设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同  

  40.         /** 

  41.          * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上,  

  42.          * 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem 格式的  

  43.          * 然后再将其真正写到 对应目录的硬盘上 

  44.          */  

  45.         factory.setRepository(new File(path));  

  46.         //设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室  

  47.         factory.setSizeThreshold(1024*1024) ;         

  48.         //高水平的API文件上传处理  

  49.         ServletFileUpload upload = new ServletFileUpload(factory);  

  50.         try {  

  51.             //可以上传多个文件  

  52.             List<FileItem> list = (List<FileItem>)upload.parseRequest(request);  

  53.             for(FileItem item : list)  

  54.             {  

  55.                 //获取表单的属性名字  

  56.                 String name = item.getFieldName();  //例如:name="usename"

  57.                 //如果获取的表单信息是普通的文本信息  

  58.                 if(item.isFormField())  

  59.                 {                     

  60.                     //获取用户具体输入的字符串 因为表单提交过来的是 字符串类型的  

  61.                     String value = item.getString() ;     

  62.                     request.setAttribute(name, value);  

  63.                 }  

  64.                 //对传入的非 简单的字符串进行处理 ,比如说二进制的图片,电影这些  

  65.                 else  

  66.                 {  

  67.                     /** 

  68.                      * 以下三步,主要获取上传文件的名字 

  69.                      */  

  70.                     //获取路径名  

  71.                     String value = item.getName() ;  

  72.                     //索引到最后一个反斜杠  

  73.                     int start = value.lastIndexOf("\\");  

  74.                     //截取上传文件的字符串名字,加1是 去掉反斜杠,  

  75.                     String filename = value.substring(start+1);  

  76.                     request.setAttribute(name, filename);  

  77.                     //真正写到磁盘上  

  78.                     //它抛出的异常 用exception 捕捉  

  79.                     //item.write( new File(path,filename) );//第三方提供的  

  80.                     //手动写的  

  81.                     OutputStream out = new FileOutputStream(new File(path,filename));  

  82.                     InputStream in = item.getInputStream() ;  

  83.                     int length = 0 ;  

  84.                     byte [] buf = new byte[1024] ;  

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

  86.                     // in.read(buf) 每次读到的数据存放在  buf 数组中  

  87.                     while( (length = in.read(buf) ) != -1)  

  88.                     {  

  89.                         //在   buf 数组中取出数据写到(输出流)磁盘上  

  90.                         out.write(buf, 0, length);

  91.                     }         

  92.                     in.close();  

  93.                     out.flush();

  94.                     out.close();  

  95.                 }  

  96.             }        

  97.         } catch (FileUploadException e) {  

  98.             // TODO Auto-generated catch block  

  99.             e.printStackTrace();  

  100.         }  

  101.         catch (Exception e) {  

  102.            // TODO Auto-generated catch block  

  103.            e.printStackTrace();  

  104.         }              

  105.         request.getRequestDispatcher("filedemo.jsp").forward(request, response);  

  106.     }    

  107. }  

3.filedemo.jsp

[html] 

  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.   </head>  

    <body>        

  1.     用户名:${requestScope.usename } <br/>  

  2.     文件:${requestScope.file1 }<br/>  

  3.     ${requestScope.file2 }<br/>  

  4.     <!-- 把上传的图片显示出来 -->  

  5.     <img alt="go" src="upload/<%=(String)request.getAttribute("file1")%> " />       

  6.   </body>  

  7. </html>  

4结果页面

转载于:https://my.oschina.net/u/1453975/blog/268911

你可能感兴趣的文章
详解 ML2 Core Plugin(II) - 每天5分钟玩转 OpenStack(72)
查看>>
httpd-2.2 配置及用法完全攻略
查看>>
IntelliJ_编译一直报错“找不到符号”
查看>>
【Mongodb】3.X 配置身份验证
查看>>
云计算就像马拉松 京东CTO为啥这么说
查看>>
2017阿里UCAN大会,听听大咖们都讲了啥
查看>>
每日一淘完成1.3亿美元融资:元生资本与DCM领投
查看>>
「每天一道面试题」Java虚拟机为新生对象分配内存有哪两种方式?
查看>>
海信电器于芝涛:坚守画质 才是消费者首选
查看>>
甘肃庆阳黄土塬告别“土炕”“火炉” 多措治污享蓝天
查看>>
NPM实用指北
查看>>
直播竞答必读:一定要提前知道的技术坑和新玩法
查看>>
React 中集成 Markdown编辑器
查看>>
Spring Boot 最佳实践(五)Spring Data JPA 操作 MySQL 8
查看>>
由三道题引伸出来的思考
查看>>
React 开发实战(一)- Repeat 组件
查看>>
小程序云开发全套实战教程(最全)
查看>>
单页引用中使用百度地图
查看>>
对 PHP 中依赖注入和控制反转的理解
查看>>
springMVC原理
查看>>