欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Servlet3.0学习总结之基于Servlet3.0的文件上传实例

程序员文章站 2023-01-07 14:49:59
在servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如apache的commons-fileupload组件,在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 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学习总结之基于Servlet3.0的文件上传实例

可以看到,使用servlet3.0提供的api实现文件上传功能是非常方便的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。