servlet3文件上传操作
作者:动力节点 时间:2023-02-05 18:27:44
在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 me.gacl.web.controller;
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 {
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;
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
可以看到,使用Servlet3.0提供的API实现文件上传功能是非常方便的。
总结
以上所述是小编给大家介绍的servlet3文件上传操作网站的支持!
来源:http://blog.sina.com.cn/s/blog_9c6852670102wy1k.html
标签:servlet3,文件上传
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
C#装饰者模式实例分析
2022-07-16 00:33:53
在Struts2中如何将父类属性序列化为JSON格式的解决方法
2022-08-01 09:30:34
java&javascript自定义加密数据传输代码示例
2021-11-29 02:09:33
Java数据结构及算法实例:三角数字
2023-08-24 17:52:25
聊聊如何打印GC日志排查的问题
2023-01-22 22:10:56
![](https://img.aspxhome.com/file/2023/8/97828_0s.jpg)
C# 爬虫简单教程
2022-04-24 14:10:53
![](https://img.aspxhome.com/file/2023/0/72470_0s.png)
Spring MVC项目中log4J和AOP使用详解
2022-11-16 08:36:29
![](https://img.aspxhome.com/file/2023/0/76540_0s.png)
从最基本的Java工程搭建SpringMVC+SpringDataJPA+Hibernate
2023-05-31 20:37:20
![](https://img.aspxhome.com/file/2023/7/61007_0s.png)
SpringBoot 如何实现异步编程
2023-04-15 13:45:43
Eclipse安装Aptana插件(注意对应版本问题)
2022-05-26 17:17:55
![](https://img.aspxhome.com/file/2023/5/116125_0s.png)
Android获取RecyclerView滑动距离方法详细讲解
2021-07-04 23:21:32
Java 8新的时间日期库的20个使用示例
2022-11-06 06:55:00
C#中的时间显示格式(12小时制VS24小时制)
2021-10-19 12:58:41
C#反射在实际应用中的实例代码
2022-11-25 05:06:21
Spring Cloud Alibaba Nacos 入门详解
2022-02-23 12:29:09
![](https://img.aspxhome.com/file/2023/0/116810_0s.jpg)
基于Java语言MD5加密Base64转换方法
2023-11-24 00:22:41
Android Studio和Gradle使用不同位置JDK的问题解决
2023-06-27 17:35:04
![](https://img.aspxhome.com/file/2023/2/84222_0s.png)
Android编程实现wifi扫描及连接的方法
2022-11-21 21:11:36
java实现鲜花销售系统
2023-08-29 20:23:42
![](https://img.aspxhome.com/file/2023/3/58333_0s.jpg)
极简的Resty服务端和客户端RESTful框架
2022-01-19 19:51:00