当前位置: 移动技术网 > IT编程>开发语言>Java > servlet3文件上传操作

servlet3文件上传操作

2019年07月19日  | 移动技术网IT编程  | 我要评论

在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文件上传操作,希望对大家有所帮助

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网