5.文件上传
大约 3 分钟
文件上传
5.1 创建一个文件上传表单
下面的 HTML 代码创建了一个文件上传表单。以下几点需要注意:
- 表单 method属性应该设置为 POST 方法,不能使用 GET 方法。
- 表单 enctype 属性应该设置为 multipart/form-data.(关键,必须设置)
- 表单 action 属性应该设置为在后端服务器上处理文件上传的 Servlet 文件。下面的实例使用了 FileUpload Servlet 来上传文件。
- 上传单个文件,您应该使用单个带有属性 type="file" 的
<input .../>
标签。为了允许多个文件上传,请包含多个 name 属性值不同的 input 标签。输入标签具有不同的名称属性的值。浏览器会为每个 input 标签关联一个浏览按钮。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="FileUpload" method="post" enctype="multipart/form-data">
<input type="file" name="upload" value="">
<input type="submit" value="Submit">
</form>
</body>
</html>
5.2 编写后台 Servlet
package Servlet;
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;
import org.apache.catalina.valves.rewrite.Substitution.RewriteRuleBackReferenceElement;
/**
* Servlet implementation class FileUpload
*/
// 必须设置这个
@MultipartConfig
@WebServlet("/FileUpload")
public class FileUpload extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public FileUpload() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
// 创建一个Part对象,通过请求的方法寻找对应name
Part part = request.getPart("upload");
response.getWriter().println(part.getSubmittedFileName());
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
5.3 Part API
方法 | 描述 | 返回值 |
---|---|---|
write(String fileName) | 将文件内容写入指定的磁盘位置 | void |
getSize() | 获取上传文件的大小 | long |
getName() | 获取file控件的name属性 | String |
getHeader(String name) | 获取指定请求头 | String |
getHeaderNames() | 获取所有请求头的名称 | String |
getHeaders(String name) | 获取指定header名称的集合数据 | Collection< String > |
getContentType() | 获取文件MIME类型 | String |
getInputStream() | 获取输入流用于检索文件的内容 | InputStream |
delete() | 删除Part数据和临时目录数据,默认会删除 | void |
getSubmittedFileName() | 获取上传文件名Servlet3.1 Tomcat8.0实现 | String |
结合 HttpServletRequest 对象和@MultipartConfig 注解来处理文件上传. 指定缓存大小和临时目录 @MutipartConfig 可以设置 相应参数限制条件,必须声明,否则会报错
参数 | 类型 | 概述 |
---|---|---|
location | String | 指定上传文件的临时目录,默认为"",绝对路径 |
fileSizeThreshold | int | 指定缓存大小,超过会先存入临时目录,默认0 |
maxFileSize | long | 单个上传文件最大大小,默认是-1,表示没有限制,单位:bytes |
maxRequestSize | long | 限制该multipart/form-data请求中数据的大小,默认是-1,表示没有限制,单位:bytes |
FileSize表示上传的单个文件的大小,RequestSize表示一次上传的总的数据量,所以可以在一个表单中一次上传多个文件。