Java Web 学习笔记之一:服务器获取表单上传的文件

Java Web 学习笔记之一:服务器获取表单上传的文件

描述

Servlet3.0标准之后,Java Web文件上传就不需要通过FileUpload 等库来实现了,
通过servlet API即可实现web后台的文件上传支持。

表单提交请求,表单中的文件可以通过request.getPart()方法获取。

下面来介绍获取文件的具体使用方法:

  • 在servlet类上添加AMultipartConfig注解
  • 通过HttpServletRequest的getPart()方法或getParts()方法获取Part对象
  • 通过操作Part对象对获取的文件进行操作

注意

添加 @MultipartConfig 注解之后,entype=”multipart/form-data” 的表单类型也可以通过
request.getParameter() 方法来获取和文件一起提交的普通字串参数。
如果没有 @MultipartConfig 注解,getParameter() 方法只能处理
enctype=”application/x-www-form-urlencoded”的表单类型。

例程以及注释:

servlet例程,getpart方法在doPost方法中使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package com.johnson.servlet;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

import com.johnson.tools.UploadUtil;


/**
* created by johnson on 2016/5/11
* @author johnson
* @version 1.0
* @description 尝试文件上传功能的servlet,需要通过jsp/html或者移动设备的表单格式发送post请求
* @attention 通过getpart获取文件的方法需要servlet3.0以上支持
* @attention 添加@MultipartConfig注解之后,multipart/form-data类型的表单也可以通过request的getparameter方法获取数据
* */

@MultipartConfig
public class FileUploadTestServlet extends HttpServlet {

/**
*
*/
private static final long serialVersionUID = 1L;

public String baseFileSavePath = null;//文件保存的基础路径(自定义)

/**
* method init
* @throws ServletException
* */
public void init(ServletConfig config)
throws ServletException{
super.init(config);
this.baseFileSavePath = this.getServletContext().getInitParameter("BaseFilePath");//从web.xml排位置文件中获取基础路径
}

/*
* @method doPost
* @description 在doPost方法中使用getPart方法获取请求上传的文件
* */
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
request.getSession();
try{
Part part0 = request.getPart("file0");//获取名称为file0的文件
part0.write(this.baseFileSavePath+UploadUtil.getFileName(part0));//用Part的write方法将文件写入磁盘中
}catch(IOException e){
e.printStackTrace();
}
try{
Part part1 = request.getPart("file1");//获取名称为file1的文件
part1.write(this.baseFileSavePath+UploadUtil.getFileName(part1));//用Part的write方法将文件写入磁盘中
}catch(IOException e){
e.printStackTrace();
}
response.getWriter().write("OK!");

}


protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
doPost(request, response);
}

}

另外一个类用来从获取的Part对象中获取相应的文件属性等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.johnson.tools;

/**
* @description 开源获取的工具类
* 此工具类只适用于Servlet 3.0
* 为了弥补 Servlet 3.0 文件上传时获取文件类型的困难问题
*
* @author xiazdong
*/
import javax.servlet.http.*;
public class UploadUtil{

//获取文件类型返回一个类似于".XXX"的字串
public static String getFileType(Part p){
String name = p.getHeader("content-disposition");
String fileNameTmp = name.substring(name.indexOf("filename=")+10);//截取字串获取文件名
String type = fileNameTmp.substring(fileNameTmp.indexOf(".")+1,fileNameTmp.indexOf("\""));//截取文件名获取文件后缀名(类型)
return type;
}

//获取文件名返回一个类似于"XXX.XXX"的完整文件名,包括了后缀
public static String getFileName(Part p){
String name = p.getHeader("content-disposition");
String fileNameTmp = name.substring(name.indexOf("filename=")+10);
String fileName = fileNameTmp.substring(0,fileNameTmp.indexOf("\""));
return fileName;
}
}