跳至主要內容

5.文件上传

Harry Xiong大约 3 分钟Web 后台ServletMVCJSPJDBC

文件上传

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 可以设置 相应参数限制条件,必须声明,否则会报错

参数类型概述
locationString指定上传文件的临时目录,默认为"",绝对路径
fileSizeThresholdint指定缓存大小,超过会先存入临时目录,默认0
maxFileSizelong单个上传文件最大大小,默认是-1,表示没有限制,单位:bytes
maxRequestSizelong限制该multipart/form-data请求中数据的大小,默认是-1,表示没有限制,单位:bytes

FileSize表示上传的单个文件的大小,RequestSize表示一次上传的总的数据量,所以可以在一个表单中一次上传多个文件。