java web中的servlet3 upload上传文件实践
作者:simon-zhao 发布时间:2021-07-09 08:33:28
标签:servlet3,upload
Servlet 3.0之前的版本中,文件上传是个挺让人头疼的问题,虽然有第三方框架来实现,但使用也还是比较麻烦,在Servlet 3.0中,这些问题将不复存在,Servlet 3.0对文件上传提供了直接支持,配合Servlet 3.0中基于Annotations的配置,大大简化上传件的操作。
一、javax.servlet.http中Part接口
public interface Part
要上传文件必须使用multipart/form-data作为request body。
版本:
Servlet 3.1 - Apache Tomcat 8.0.33
二、方法概述
方法 | 描述 |
---|---|
void delete() | 删除磁盘上关于此part对象的缓存文件 |
java.lang.String getContentType() | 获取浏览器传递过来的ContentType |
java.lang.String getHeader(java.lang.String name) | 获取浏览器传递过来的特定的header,参数是header的名字 |
java.util.Collection getHeaderNames() | 获取传递给这个part的所有header的名字 |
java.util.Collection getHeaders(java.lang.String name) | 获取该name对应的所有的value |
java.io.InputStream getInputStream() | 获取InputStream对象,可以用于获取上传的文件的内容 |
java.lang.String getName() | 获取对应于此part的multipart表单的名字 |
long getSize() | 获取此part的大小,如果是上传文件的话,表示上传的文件大小 |
java.lang.String getSubmittedFileName() | 如果此part表示上传文件的话,返回上传的文件的名字 |
void write(java.lang.String fileName) | 一个比较方便的方法,将上传的文件写入磁盘中 |
三、@MultipartConfig注解
用于处理文件上传的servlet必须使用@MultipartConfig注解,@MultipartConfig注解有4个属性。
属性 | 类型 | 概述 |
---|---|---|
fileSizeThreshold | int | 文件大小阀值,当文件大小大于此值时,文件将被写入磁盘 |
location | String | 服务器端目录,服务器把客户端上传的文件默认存入此目录下 |
maxFileSize | long | 允许上传的文件的最大大小,默认是-1,表示没有限制 |
maxRequestSize | long | 限制该multipart/form-data请求的最大数据量,默认是-1,表示没有限制 |
四、处理文件上传的servlet
//此处的@MultipartConfig注解给出了文件存放的地址和允许上传的文件最大值
@MultipartConfig(location="F:/", maxFileSize = 1024*1024*20)
@WebServlet(name="UploadFileTest", urlPatterns="/upload")
public class UploadFileTest extends HttpServlet{
private static final long serialVersionUID = 1L;
//使用了commons-logging和log4j来处理日志
private static Log log = LogFactory.getLog(UploadFileTest.class);
//获取注解中设置的值
private static MultipartConfig config
= UploadFileTest.class.getAnnotation(MultipartConfig.class);
public UploadFileTest() {
// TODO Auto-generated constructor stub
}
public void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException{
request.setCharacterEncoding("UTF-8");
Part part = null;
try{
part = request.getPart("file");//获取part用于处理上传的文件
}catch(IllegalStateException ise){
//上传的单个文件超出maxFileSize或者上传的总的数据量超出maxRequestSize时会抛出此异常
if(config.maxRequestSize() == -1L)//如果注解中没设置此项,那就是单个文件超出限制
log.error("单个文件超限");
else if(config.maxFileSize() == -1L)//如果注解中没有设置单个文件最大限制,那就是总数据量超限。
log.error("总数据量超限");
else
log.error("Error");
}
if(part == null)
return;
String fileName = part.getSubmittedFileName();//获得上传的文件名,没有判断用户没有选择文件直接提交的情况,没有判断上传文件失败的情况
log.info("contentType : " + part.getContentType());
log.info("fileName : " + fileName);
log.info("fileSize : " + part.getSize());
log.info("header names :");
for(String headerName : part.getHeaderNames())
log.info(headerName + " : " + part.getHeader(headerName));
//为了避免文件重名,将时间组合到了文件名中。实际项目中可以考虑使用用户主键或者生成一个唯一的ID来组合文件名。
String saveName = System.currentTimeMillis() + fileName;
part.write(saveName);//将上传的文件保存到磁盘,默认是注解中location的相对地址,也可以传入一个绝对路径
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " +
"transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>Upload File</title></head>\n" +
"<body bgcolor=\"#f0f0f0\">\n" +
"<h1 align=\"center\">Upload File</h1>\n" +
"<h2 align=\"center\">上传文件" + fileName+ "成功," +
"可以到项目目录的F:\\下查看,保存的文件名是:"+
saveName+"</h2>\n" +
"</body></html>");
}
}
五、前端html页面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Upload File</title>
</head>
<body>
<form action="upload" method="POST" enctype="multipart/form-data">
<table align="center" border="1" width="50%">
<tr>
<td>选择要上传的文件:</td>
<td><input type="file" name="file"></td>
</tr>
<tr>
<td><input type="submit" value="上传"></td>
</tr>
</table>
</form>
</body>
</html>
servlet使用了注解的方式注册,所以不再需要使用web.xml文件。新建一个web工程,就使用这两个文件就可以部署到tomcat了,要访问的url是http://localhost:8080/UploadFileTest/UploadFile.html
总结
以上所述是小编给大家介绍的servlet3 upload上传文件实践网站的支持!
来源:http://blog.csdn.net/u010902721/article/details/51378282
0
投稿
猜你喜欢
- 工具/原料vs2005步骤/方法新建安装部署项目打开VS,点击新建项目,选择:其他项目类型->安装与部署->安装向导(安装项目也
- 使用wait()和notify()实现Java多线程通信:两个线程交替打印A和B,如ABABABpublic class Test { &n
- 介绍Java命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成一个对象,从而使不同的请求可以进行参数化,并支持请
- 其实写到这里,我已经差不多断气了。。。常规套路,这里是前三篇的传送门,需要的同学可以看一下:JAVA写文本编辑器(三) JAVA写文本编辑器
- 一、XSSFpackage com.yy.demo01;import java.io.FileInputStream;import java
- RibbonRibbon 是 Netflix开源的基于HTTP和TCP等协议负载均衡组件Ribbon 可以用来做客户端负载均衡,调用注册中心
- 最早开始的时候做过一些数据Excel导出的功能,但是到后期每一次导出都需要写一些差不多类似的代码,稍微研究了一下写了个公共的导出方法。这里用
- DataSet 对象是支持 ADO.NET的断开式、分布式数据方案的核心对象 ,用途非常广泛.我们很多时候需要使用其中的数据,比如取得一个D
- package org.itat.stax;import java.io.IOException;import java.io.InputS
- 一、什么是 javabean ?在jsp页面中,包含html代码、css代码、java代码、以及业务逻辑处理代码等。javabean的作用就
- 运行远程主机上的shell脚本下面的例子是教给大家如何通过java程序,运行远程主机上的shell脚本。(我讲的不是一个黑客学习教程,而是使
- 1、JavaBean介绍 * JavaBean的定义:JavaBeans是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)
- rocketmq消费者注册监听有两种模式有序消费MessageListenerOrderly和并发消费MessageListenerConc
- 一、Kt调用-Java参数非null的处理@NotNullclass TestJava { public void
- 前言我个人觉得,中间件的部署与使用是非常难记忆的;也就是说,如果两次使用中间件的时间间隔比较长,那基本上等于要重新学习使用。所以,我觉得学习
- 一: Environment.StackTrace可能我们看到最多的就是catch中的e参数,里面会有一个StackTrace,然后不可否认
- 面试题1:你们是怎样保存用户密码等敏感数据的?本题回答参考朱晔的《Java业务开发常见错误100例》我们知道,用户名、密码、身份证等都属于用
- 本文旨在通过重写Comparator接口的compare()方法实现对List的升序、降序、倒序排序。首先明确一点:compare(Inte
- 用过spring框架进行开发的人,多多少少会使用过它的AOP功能,都知道有@Before、@Around和@After等advice。最近,
- Java线程的概念和其他多数计算机语言不同,Java内置支持多线程编程(multithreaded programming)。多线程程序包含