java web中的servlet3 upload上传文件实践

 更新时间:2017年11月02日 11:02:30   作者:simon-zhao  
这篇文章主要介绍了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上传文件实践,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • SpringBoot中通过实现WebMvcConfigurer参数校验的方法示例

    SpringBoot中通过实现WebMvcConfigurer参数校验的方法示例

    这篇文章主要介绍了SpringBoot中通过实现WebMvcConfigurer参数校验的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • java微信扫码支付模式一线下支付功能实现

    java微信扫码支付模式一线下支付功能实现

    本篇文章主要介绍了JAVA微信扫码支付模式一线下支付功能实现,具有一定的参考价值,有需要的可以了解一下。
    2016-11-11
  • Java设计模式之策略模式

    Java设计模式之策略模式

    这篇文章介绍了Java设计模式之策略模式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • SpringMVC Cron定时器Demo常见问题解决方案

    SpringMVC Cron定时器Demo常见问题解决方案

    这篇文章主要介绍了SpringMVC Cron定时器Demo常见问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Java图片与二进制相互转换实现示例讲解

    Java图片与二进制相互转换实现示例讲解

    这篇文章主要介绍了Java图片与二进制相互转换实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-03-03
  • IDEA创建parent项目(聚合项目)

    IDEA创建parent项目(聚合项目)

    这篇文章主要介绍了IDEA创建parent项目(聚合项目),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • 通过实践了解如何处理Java异常

    通过实践了解如何处理Java异常

    Java中的异常处理不是一个简单的主题。初学者发现它很难理解,甚至有经验的开发者也可以花几个小时讨论如何以及应该抛出或处理哪些异常。下面我们通过实践来了解如何解决异常
    2019-05-05
  • Spring服务注解有哪些

    Spring服务注解有哪些

    这篇文章主要介绍了Spring服务注解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2016-11-11
  • Java生成验证码功能实例代码

    Java生成验证码功能实例代码

    页面上输入验证码是比较常见的一个功能,实现起来也很简单.给大家写一个简单的生成验证码的示例程序,需要的朋友可以借鉴一下
    2017-05-05
  • Java中的CopyOnWriteArrayList解析

    Java中的CopyOnWriteArrayList解析

    这篇文章主要介绍了Java中的CopyOnWriteArrayList解析,ArrayList是非线程安全的,也就是说在多个线程下进行读写,会出现异常,既然是非线程安全,那我们就使用一些机制把它变安全不就好了,需要的朋友可以参考下
    2023-12-12

最新评论