天天看点

利用 WebServlet3.0新特性Part实现文件上传

利用webservlet3.0新特性来上传文件的操作是十分简单的,首先我们要在servlet中加入标注@MultipartConfig,

该标注主要是为了辅助Servlet3.0中HttpServletRequest提供的对上传文件的支持。该标注写在Servlet类的声明之前,一表示该Servlet希望处理的请求时multipart/form-data类型的。因为上传文件类型会指定文件类型enctype="multipart/form-data",该标注还提供了若干属性用于简化对上传文件的处理。

multipart/form-data是将文件以二进制的形式上传,这样可以实现多种类型的文件上传。所以当你不加入标注@MultipartConfig,利用request.getpart()就得不到文件,得到的值将是null。      
所以第一步就是加上注解@MultipartConfig。      
下面给大家一个完整的上传文件代码详解:      

package com.Myweb.MyServlet;

import java.io.File;

import java.io.IOException;

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(urlPatterns="/MyUploadServlet.action")

//multipart/form-data是将文件以二进制的形式上传,这样可以实现多种类型的文件上传

@MultipartConfig

public class UploadServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

// TODO Auto-generated method stub

doPost(req, resp);

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

// TODO Auto-generated method stub

//利用的HttpServletRequest类的getPart方法去获取一个单文件信息;

Part part =req.getPart("file");//获取单个文件

//利用getHeader()方法得到的是文件头部信息;

例如我上传文件利用System.out.println(fi+"==header内容");打印出header信息为:

头部信息为form-data; name="file"; filename="register.jsp";

这里面就包括了文件名,所以我们需要通过对字符串的操作来获取fileName;所以我们在下面定义了一个获取文件名的方法,

通过方法getFileName(String  str)去获取到文件名;

String fi=part.getHeader("content-disposition");

//System.out.println(fi+"==header内容");

//System.out.println(getFileName(fi)+"===="); 

String filepath=getFileName(fi);

//然后我这里写的是把文件上传到tomcat下面已发布的webapp下面自己新建的myupload目录下面;这样可以随时查看;

String path=req.getServletContext().getRealPath("myupload");//项目所在目录,把文件最好存在tomcat上面;

//然后利用文件分割符将目录+文件名拼接起来,然后利用Part.write写入到指定路径,

part.write(path+File.separator+filepath);//File.separator与系统有关的分割符

//F:\Apache\aph8\work\Catalina\localhost\Myweb

//如果不指定路径,则会设置默认路径;

}

public String  getFileName(String  str){

//因为传过来的是头部信息form-data; name="file"; filename="register.jsp";

所以我们需要截取filename="后面的字符串,通过lastindex方式获取索引,然后通过substring方法来截取文件名;

然后返回截取的文件名。

int beginindexof=str.lastIndexOf("=");

int lastindexof=str.lastIndexOf("\"");

str=str.substring(beginindexof+2, lastindexof);

System.out.println(str);

return str;

}}

这样servlet就差不多写完了;

//jsp页面上代码如下:

//一定要加上这句enctype="multipart/form-data";不然不能进行文件上传的,格式不对

 <form action="MyUploadServlet.action" method="post" enctype="multipart/form-data">

 <label>选择文件</label>   

 <input type="file" name="file"/>

    <br/>

    <input type="submit" value="上传"/>

    </form>

继续阅读