文件上传流程
1、在客户端HTML 页面通过一个表单打开一个文件,交给服务器。
表<form>标签中应指定enctype属性值为"multipart/form-data",method属性为"post",同时表单中提供一个<input type="file">作用域用于指定上传的文件。
2、服务器通过getInputSream ()获取ServletInputSteam对象。文件内容在还对象中,还包含表单域的名称和值、上传的文件名、内容类型等信息。
输入流内容:
表单提交时,浏览器将表单各个部分发送到服务器端,各部分用分隔符分开,服务器端使用Servlet可得到上传的文件并保存到特定位置。
- @MultipartConfig
对实现文件上传的Servlet类必须使用@MultipartConfig注解,使用该注解告诉容器该Servlet能够处理multipart/form-data的请求。使用该注解,HttpServletRequest对象才可以得到表单数据的各部分。
- 通过请求对象Request request处理上传的文件
(1)public Part getPart(String name):返回用name指定的Part对象
(2)public Collection<Part> getParts():返回所有Part对象集合
- Part接口,表示多部分表单数据的一部分。它的函数:
(1)public InputStream getInputSttream()throws IOException:返回Part对象的输入流对象
(2)public String getContentType():返回Part对象的内容类型
(3)public String getName():返回Part对象的名称
(4)public long geiSize():返回Part对象大小
(5)public String getHeader(String name):返回Part对象指定的MIME头的值
(6)public Collection<Stringt> getHeaders(String name):返回name指定的头值的集合
(7)public Collection<Stringt> getHeaderNames():返回头值的名称集合
(8)public void delete() throws IOException:删除临时文件
(9)public void write(String fileName) throws IOException:将Part对象写到指定文件
响应重定向
Servlet分析请求后可能不直接向浏览器发送响应,而是向浏览器发送一个Location头,告诉浏览器访问其他资源。
public void sendResirect(String location)
文件上传实例:
fileLoad.jsp:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>上传文件</title></head>
<body>
${message}<br>
<form action="FileUploadServlet" enctype="multipart/form-data"
method="post">
<table>
<tr> <td colspan="2" align="center">文件上传</td>
</tr>
<tr><td>会员号:</td>
<td><input type="text" name="mnumber" size="30" /></td>
</tr>
<tr> <td>文件名:</td>
<td><input type="file" name="fileName" size="30" /></td>
</tr>
<tr>
<td align="right"><input type="submit" value="提交" /></td>
<td align="left"><input type="reset" value="重置"/></td>
</tr>
</table>
</form>
</body>
</html>
FileUploadServlet.java
package com;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
@MultipartConfig(location="D:\\",fileSizeThreshold=1024)
public class FileUploadServlet extends HttpServlet{
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,IOException{
// 返回Web应用程序文档根目录
String path = this.getServletContext().getRealPath("/");
String mnumber = request.getParameter("mnumber");
Part p = request.getPart("fileName");
String message="";
if(p.getSize() >1024*1024){ // 上传的文件不能超过1MB大小
p.delete();
message = "文件太大,不能上传!";
}else{
path = path + "\\student\\" +mnumber;
File f = new File(path);
if( !f.exists()){ // 若目录不存在,则创建目录
f.mkdirs();
}
String h = p.getHeader("content-disposition");
// 得到文件名
String fname = h.substring(h.lastIndexOf("\\")+1, h.length()-1);
p.write(path + "\\"+ fname);
message = "文件上传成功!";
}
request.setAttribute("message", message);
RequestDispatcher rd = request.getRequestDispatcher("/fileUpload.jsp");
rd.forward(request, response);
}
}