Servlet3.0学习总结(三)——基于Servlet3.0的文件上传

  在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileupload组件,在Servlet3.0中提供了对文件上传的原生支持,我们不需要借助任何第三方上传组件,直接使用Servlet3.0提供的API就能够实现文件上传功能了。

一、使用Servlet3.0提供的API实现文件上传

1.1、编写上传页面

  1. <%@ page language="java" pageEncoding="UTF-8"%>
  2. <!DOCTYPE HTML>
  3. <html>
  4. <head>
  5. <title>Servlet3.0实现文件上传</title>
  6. </head>
  7.  
  8. <body>
  9. <fieldset>
  10. <legend>
  11. 上传单个文件
  12. </legend>
  13. <!-- 文件上传时必须要设置表单的enctype="multipart/form-data"-->
  14. <form action="${pageContext.request.contextPath}/UploadServlet"
  15. method="post" enctype="multipart/form-data">
  16. 上传文件:
  17. <input type="file" name="file">
  18. <br>
  19. <input type="submit" value="上传">
  20. </form>
  21. </fieldset>
  22. <hr />
  23. <fieldset>
  24. <legend>
  25. 上传多个文件
  26. </legend>
  27. <!-- 文件上传时必须要设置表单的enctype="multipart/form-data"-->
  28. <form action="${pageContext.request.contextPath}/UploadServlet"
  29. method="post" enctype="multipart/form-data">
  30. 上传文件:
  31. <input type="file" name="file1">
  32. <br>
  33. 上传文件:
  34. <input type="file" name="file2">
  35. <br>
  36. <input type="submit" value="上传">
  37. </form>
  38. </fieldset>
  39. </body>
  40. </html>

1.2、开发处理文件上传的Servlet

  1、使用注解@MultipartConfig将一个Servlet标识为支持文件上传。

  2、Servlet3.0将multipart/form-data的POST请求封装成Part,通过Part对上传的文件进行操作

  UploadServlet 代码如下:

  1. package com.qixin.servlet;
  2.  
  3. import java.io.File;
  4. import java.io.IOException;
  5. import java.io.PrintWriter;
  6. import java.util.Collection;
  7.  
  8. import javax.servlet.ServletException;
  9. import javax.servlet.annotation.MultipartConfig;
  10. import javax.servlet.annotation.WebServlet;
  11. import javax.servlet.http.HttpServlet;
  12. import javax.servlet.http.HttpServletRequest;
  13. import javax.servlet.http.HttpServletResponse;
  14. import javax.servlet.http.Part;
  15.  
  16. //使用@WebServlet配置UploadServlet的访问路径
  17. @WebServlet(name="UploadServlet",urlPatterns="/UploadServlet")
  18. //使用注解@MultipartConfig将一个Servlet标识为支持文件上传
  19. @MultipartConfig//标识Servlet支持文件上传
  20. public class UploadServlet extends HttpServlet {
  21.  
  22. @Override
  23. public void doGet(HttpServletRequest request, HttpServletResponse response)
  24. throws ServletException, IOException {
  25. request.setCharacterEncoding("utf-8");
  26. response.setCharacterEncoding("utf-8");
  27. response.setContentType("text/html;charset=utf-8");
  28. //存储路径
  29. String savePath = request.getServletContext().getRealPath("/WEB-INF/uploadFile");
  30. //获取上传的文件集合
  31. Collection<Part> parts = request.getParts();
  32. //上传单个文件
  33. if (parts.size()==1) {
  34. //Servlet3.0将multipart/form-data的POST请求封装成Part,通过Part对上传的文件进行操作。
  35. //Part part = parts[0];//从上传的文件集合中获取Part对象
  36. Part part = request.getPart("file");//通过表单file控件(<input type="file" name="file">)的名字直接获取Part对象
  37. //Servlet3没有提供直接获取文件名的方法,需要从请求头中解析出来
  38. //获取请求头,请求头的格式:form-data; name="file"; filename="snmp4j--api.zip"
  39. String header = part.getHeader("content-disposition");
  40. //获取文件名
  41. String fileName = getFileName(header);
  42. //把文件写到指定路径
  43. part.write(savePath+File.separator+fileName);
  44. }else {
  45. //一次性上传多个文件
  46. for (Part part : parts) {//循环处理上传的文件
  47. //获取请求头,请求头的格式:form-data; name="file"; filename="snmp4j--api.zip"
  48. String header = part.getHeader("content-disposition");
  49. //获取文件名
  50. String fileName = getFileName(header);
  51. //把文件写到指定路径
  52. part.write(savePath+File.separator+fileName);
  53. }
  54. }
  55. PrintWriter out = response.getWriter();
  56. out.println("上传成功");
  57. out.flush();
  58. out.close();
  59. }
  60.  
  61. /**
  62. * 根据请求头解析出文件名
  63. * 请求头的格式:火狐和google浏览器下:form-data; name="file"; filename="snmp4j--api.zip"
  64. * IE浏览器下:form-data; name="file"; filename="E:\snmp4j--api.zip"
  65. * @param header 请求头
  66. * @return 文件名
  67. */
  68. public String getFileName(String header) {
  69. /**
  70. * String[] tempArr1 = header.split(";");代码执行完之后,在不同的浏览器下,tempArr1数组里面的内容稍有区别
  71. * 火狐或者google浏览器下:tempArr1={form-data,name="file",filename="snmp4j--api.zip"}
  72. * IE浏览器下:tempArr1={form-data,name="file",filename="E:\snmp4j--api.zip"}
  73. */
  74. String[] tempArr1 = header.split(";");
  75. /**
  76. *火狐或者google浏览器下:tempArr2={filename,"snmp4j--api.zip"}
  77. *IE浏览器下:tempArr2={filename,"E:\snmp4j--api.zip"}
  78. */
  79. String[] tempArr2 = tempArr1[2].split("=");
  80. //获取文件名,兼容各种浏览器的写法
  81. String fileName = tempArr2[1].substring(tempArr2[1].lastIndexOf("\\")+1).replaceAll("\"", "");
  82. return fileName;
  83. }
  84.  
  85. @Override
  86. public void doPost(HttpServletRequest request, HttpServletResponse response)
  87. throws ServletException, IOException {
  88. this.doGet(request, response);
  89. }
  90. }

运行结果如下:

  

  可以看到,使用Servlet3.0提供的API实现文件上传功能是非常方便的。

Servlet3.0学习总结——基于Servlet3.0的文件上传的更多相关文章

  1. [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  2. 用c++开发基于tcp协议的文件上传功能

    用c++开发基于tcp协议的文件上传功能 2005我正在一家游戏公司做程序员,当时一直在看<Windows网络编程> 这本书,把里面提到的每种IO模型都试了一次,强烈推荐学习网络编程的同学 ...

  3. Struts2文件上传(基于表单的文件上传)

    •Commons-FileUpload组件 –Commons是Apache开放源代码组织的一个Java子项目,其中的FileUpload是用来处理HTTP文件上传的子项目   •Commons-Fil ...

  4. 构建基于阿里云OSS文件上传服务

    转载请注明来源:http://blog.csdn.net/loongshawn/article/details/50710132 <构建基于阿里云OSS文件上传服务> <构建基于OS ...

  5. 基于socket实现大文件上传

    import socket 1.客户端: 操作流程: 先拿到文件--->获取文件大小---->创建字典 1.制作表头 header  如何得到 他是一个二进制字符串 序列化得到 字典字符串 ...

  6. 基于cxf的app文件上传接口(带回显功能)

    1.SaleImpl @Override public String uploadPic(final List<Attachment> attachments) { return this ...

  7. ios开发网络学习十二:NSURLSession实现文件上传

    #import "ViewController.h" // ----WebKitFormBoundaryvMI3CAV0sGUtL8tr #define Kboundary @&q ...

  8. Python 基于Python实现Ftp文件上传,下载

    基于Python实现Ftp文件上传,下载   by:授客 QQ:1033553122 测试环境: Ftp客户端:Windows平台 Ftp服务器:Linux平台 Python版本:Python 2.7 ...

  9. SpringMVC案例3----spring3.0项目拦截器、ajax、文件上传应用

    依然是项目结构图和所需jar包图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVuamFtaW5fd2h4/font/5a6L5L2T/fontsi ...

随机推荐

  1. js中比较实用的时期格式化

    在javascript中,关于时间格式的转换. 可以将“2010-1-2” 转换为 “2010-01-02 00:00:00” 或者将“2010-1-2 2:13:6" 转换为 “2010- ...

  2. elixir 高可用系列(一) Agent

    概述 elixir 本身是一种 immutable 的语言,默认情况下,进程间是不共享任何状态的,进程之间通过消息来交互. 而 Agent 则封装了一种进程间共享状态的方式,通过这种方式,不用显式的写 ...

  3. 46 个非常有用的 PHP 代码片段

    在编写代码的时候有个神奇的工具总是好的!下面这里收集了 40+ PHP 代码片段,可以帮助你开发 PHP 项目. 这些 PHP 片段对于 PHP 初学者也非常有帮助,非常容易学习,让我们开始学习吧- ...

  4. 个性二维码开源专题<基础篇>

    二维码原理介绍: 二维码为什么是黑白相间的?黑色表示二进制的“1”,白色表示二进制的“0” “我们之所以对二维码进行扫描能读出那么多信息,就是因为这些信息被编入了二维码之中.”黄海平说,“制作二维码输 ...

  5. 通过git rebase修改commit message

    今天发现一个项目的git commit message中的单词拼错了,需要修改一下.但这样简单的修改,需要通过git rebase才能完成. 首先要git rebase到需要修改message的那个c ...

  6. 某些版本的IIS可能有SessionID混淆的Bug

    某公司为我服务的甲方公司开发一个挺重要的应用.已经上线了一年多了,不停的修修改改.也算正常使用.正所谓,秀恩爱,死得快.No 作就No Die.也少知道是那个Smarty Pants闲的蛋疼说新修改的 ...

  7. SQL Server转发记录指针的坏味道

    什么是转发记录指针? 转发记录指针是堆表中特有的数据存储机制. 当你修改了某个数据页中的一行时,如果该行所在的数据页已经无法存放其修改后的行, SQL Server会把这行数据移动到一个新的数据页上面 ...

  8. RSA密钥的跨平台通用

    RSA使用public key加密,用private key解密(签名相反,使用private key签名,用public key验证签名).比如我跟合作方D之间的数据传输,我使用D提供给我的publ ...

  9. 杂记 C中的volatile

    volatile 就象大家更熟悉的const一样,volatile是一个类型修饰符(type specifier).它是被设计用来修饰被不同线程访问和修改的变量.如果没有volatile,基本上会导致 ...

  10. [WinAPI] 串口1-创建[包括: 打不开串口]

    本来是用一个USB扩展把一个USB括成4个,然后把USB转串口连接上,虽然设备管理器可以找到用SSCOM也能找到,但是用API就是打不开,最后把USB转串插在电脑的一个USB上就可以啦! #inclu ...