Servlet3.0学习总结——基于Servlet3.0的文件上传
Servlet3.0学习总结(三)——基于Servlet3.0的文件上传
在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileupload组件,在Servlet3.0中提供了对文件上传的原生支持,我们不需要借助任何第三方上传组件,直接使用Servlet3.0提供的API就能够实现文件上传功能了。
一、使用Servlet3.0提供的API实现文件上传
1.1、编写上传页面
- <%@ page language="java" pageEncoding="UTF-8"%>
- <!DOCTYPE HTML>
- <html>
- <head>
- <title>Servlet3.0实现文件上传</title>
- </head>
- <body>
- <fieldset>
- <legend>
- 上传单个文件
- </legend>
- <!-- 文件上传时必须要设置表单的enctype="multipart/form-data"-->
- <form action="${pageContext.request.contextPath}/UploadServlet"
- method="post" enctype="multipart/form-data">
- 上传文件:
- <input type="file" name="file">
- <br>
- <input type="submit" value="上传">
- </form>
- </fieldset>
- <hr />
- <fieldset>
- <legend>
- 上传多个文件
- </legend>
- <!-- 文件上传时必须要设置表单的enctype="multipart/form-data"-->
- <form action="${pageContext.request.contextPath}/UploadServlet"
- method="post" enctype="multipart/form-data">
- 上传文件:
- <input type="file" name="file1">
- <br>
- 上传文件:
- <input type="file" name="file2">
- <br>
- <input type="submit" value="上传">
- </form>
- </fieldset>
- </body>
- </html>
1.2、开发处理文件上传的Servlet
1、使用注解@MultipartConfig将一个Servlet标识为支持文件上传。
2、Servlet3.0将multipart/form-data的POST请求封装成Part,通过Part对上传的文件进行操作。
UploadServlet 代码如下:
- package com.qixin.servlet;
- import java.io.File;
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.util.Collection;
- import javax.servlet.ServletException;
- import javax.servlet.annotation.MultipartConfig;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.http.Part;
- //使用@WebServlet配置UploadServlet的访问路径
- @WebServlet(name="UploadServlet",urlPatterns="/UploadServlet")
- //使用注解@MultipartConfig将一个Servlet标识为支持文件上传
- @MultipartConfig//标识Servlet支持文件上传
- public class UploadServlet extends HttpServlet {
- @Override
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- request.setCharacterEncoding("utf-8");
- response.setCharacterEncoding("utf-8");
- response.setContentType("text/html;charset=utf-8");
- //存储路径
- String savePath = request.getServletContext().getRealPath("/WEB-INF/uploadFile");
- //获取上传的文件集合
- Collection<Part> parts = request.getParts();
- //上传单个文件
- if (parts.size()==1) {
- //Servlet3.0将multipart/form-data的POST请求封装成Part,通过Part对上传的文件进行操作。
- //Part part = parts[0];//从上传的文件集合中获取Part对象
- Part part = request.getPart("file");//通过表单file控件(<input type="file" name="file">)的名字直接获取Part对象
- //Servlet3没有提供直接获取文件名的方法,需要从请求头中解析出来
- //获取请求头,请求头的格式:form-data; name="file"; filename="snmp4j--api.zip"
- String header = part.getHeader("content-disposition");
- //获取文件名
- String fileName = getFileName(header);
- //把文件写到指定路径
- part.write(savePath+File.separator+fileName);
- }else {
- //一次性上传多个文件
- for (Part part : parts) {//循环处理上传的文件
- //获取请求头,请求头的格式:form-data; name="file"; filename="snmp4j--api.zip"
- String header = part.getHeader("content-disposition");
- //获取文件名
- String fileName = getFileName(header);
- //把文件写到指定路径
- part.write(savePath+File.separator+fileName);
- }
- }
- PrintWriter out = response.getWriter();
- out.println("上传成功");
- out.flush();
- out.close();
- }
- /**
- * 根据请求头解析出文件名
- * 请求头的格式:火狐和google浏览器下:form-data; name="file"; filename="snmp4j--api.zip"
- * IE浏览器下:form-data; name="file"; filename="E:\snmp4j--api.zip"
- * @param header 请求头
- * @return 文件名
- */
- public String getFileName(String header) {
- /**
- * String[] tempArr1 = header.split(";");代码执行完之后,在不同的浏览器下,tempArr1数组里面的内容稍有区别
- * 火狐或者google浏览器下:tempArr1={form-data,name="file",filename="snmp4j--api.zip"}
- * IE浏览器下:tempArr1={form-data,name="file",filename="E:\snmp4j--api.zip"}
- */
- String[] tempArr1 = header.split(";");
- /**
- *火狐或者google浏览器下:tempArr2={filename,"snmp4j--api.zip"}
- *IE浏览器下:tempArr2={filename,"E:\snmp4j--api.zip"}
- */
- String[] tempArr2 = tempArr1[2].split("=");
- //获取文件名,兼容各种浏览器的写法
- String fileName = tempArr2[1].substring(tempArr2[1].lastIndexOf("\\")+1).replaceAll("\"", "");
- return fileName;
- }
- @Override
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- this.doGet(request, response);
- }
- }
运行结果如下:
可以看到,使用Servlet3.0提供的API实现文件上传功能是非常方便的。
Servlet3.0学习总结——基于Servlet3.0的文件上传的更多相关文章
- [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- 用c++开发基于tcp协议的文件上传功能
用c++开发基于tcp协议的文件上传功能 2005我正在一家游戏公司做程序员,当时一直在看<Windows网络编程> 这本书,把里面提到的每种IO模型都试了一次,强烈推荐学习网络编程的同学 ...
- Struts2文件上传(基于表单的文件上传)
•Commons-FileUpload组件 –Commons是Apache开放源代码组织的一个Java子项目,其中的FileUpload是用来处理HTTP文件上传的子项目 •Commons-Fil ...
- 构建基于阿里云OSS文件上传服务
转载请注明来源:http://blog.csdn.net/loongshawn/article/details/50710132 <构建基于阿里云OSS文件上传服务> <构建基于OS ...
- 基于socket实现大文件上传
import socket 1.客户端: 操作流程: 先拿到文件--->获取文件大小---->创建字典 1.制作表头 header 如何得到 他是一个二进制字符串 序列化得到 字典字符串 ...
- 基于cxf的app文件上传接口(带回显功能)
1.SaleImpl @Override public String uploadPic(final List<Attachment> attachments) { return this ...
- ios开发网络学习十二:NSURLSession实现文件上传
#import "ViewController.h" // ----WebKitFormBoundaryvMI3CAV0sGUtL8tr #define Kboundary @&q ...
- Python 基于Python实现Ftp文件上传,下载
基于Python实现Ftp文件上传,下载 by:授客 QQ:1033553122 测试环境: Ftp客户端:Windows平台 Ftp服务器:Linux平台 Python版本:Python 2.7 ...
- SpringMVC案例3----spring3.0项目拦截器、ajax、文件上传应用
依然是项目结构图和所需jar包图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVuamFtaW5fd2h4/font/5a6L5L2T/fontsi ...
随机推荐
- js中比较实用的时期格式化
在javascript中,关于时间格式的转换. 可以将“2010-1-2” 转换为 “2010-01-02 00:00:00” 或者将“2010-1-2 2:13:6" 转换为 “2010- ...
- elixir 高可用系列(一) Agent
概述 elixir 本身是一种 immutable 的语言,默认情况下,进程间是不共享任何状态的,进程之间通过消息来交互. 而 Agent 则封装了一种进程间共享状态的方式,通过这种方式,不用显式的写 ...
- 46 个非常有用的 PHP 代码片段
在编写代码的时候有个神奇的工具总是好的!下面这里收集了 40+ PHP 代码片段,可以帮助你开发 PHP 项目. 这些 PHP 片段对于 PHP 初学者也非常有帮助,非常容易学习,让我们开始学习吧- ...
- 个性二维码开源专题<基础篇>
二维码原理介绍: 二维码为什么是黑白相间的?黑色表示二进制的“1”,白色表示二进制的“0” “我们之所以对二维码进行扫描能读出那么多信息,就是因为这些信息被编入了二维码之中.”黄海平说,“制作二维码输 ...
- 通过git rebase修改commit message
今天发现一个项目的git commit message中的单词拼错了,需要修改一下.但这样简单的修改,需要通过git rebase才能完成. 首先要git rebase到需要修改message的那个c ...
- 某些版本的IIS可能有SessionID混淆的Bug
某公司为我服务的甲方公司开发一个挺重要的应用.已经上线了一年多了,不停的修修改改.也算正常使用.正所谓,秀恩爱,死得快.No 作就No Die.也少知道是那个Smarty Pants闲的蛋疼说新修改的 ...
- SQL Server转发记录指针的坏味道
什么是转发记录指针? 转发记录指针是堆表中特有的数据存储机制. 当你修改了某个数据页中的一行时,如果该行所在的数据页已经无法存放其修改后的行, SQL Server会把这行数据移动到一个新的数据页上面 ...
- RSA密钥的跨平台通用
RSA使用public key加密,用private key解密(签名相反,使用private key签名,用public key验证签名).比如我跟合作方D之间的数据传输,我使用D提供给我的publ ...
- 杂记 C中的volatile
volatile 就象大家更熟悉的const一样,volatile是一个类型修饰符(type specifier).它是被设计用来修饰被不同线程访问和修改的变量.如果没有volatile,基本上会导致 ...
- [WinAPI] 串口1-创建[包括: 打不开串口]
本来是用一个USB扩展把一个USB括成4个,然后把USB转串口连接上,虽然设备管理器可以找到用SSCOM也能找到,但是用API就是打不开,最后把USB转串插在电脑的一个USB上就可以啦! #inclu ...