利用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>