1. 基于 form 表单实现的上传文件
核心方法
HttpServletRequest 类方法
方法
|
描述 |
Part getPart(String name) |
获取请求中给定 name 的文件
|
Collection<Part> getParts() |
获取所有的文件 |
Part
类方法
方法
|
描述 |
String getSubmittedFileName() |
获取提交的文件名 |
String getContentType() |
获取提交的文件类型 |
long getSize() |
获取文件的大小 |
void write(String path) |
把提交的文件数据写入磁盘文件 |
代码示例
客户端代码:
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="MyFile">
<input type="submit" value="上传">
</form>
服务器代码:
// Servlet 的文件上传功能默认是关闭的, 需要手动加上注解打开
@MultipartConfig
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Part part = req.getPart("MyFile");
// 获取到文件的真实名字
System.out.println(part.getSubmittedFileName());
// 获取文件大小
System.out.println(part.getSize());
// 获取文件的类型
System.out.println(part.getContentType());
// 把文件写入服务器这边的磁盘中
part.write("d:/result.jpg");
resp.getWriter().write("upload ok");
}
}
1. 表单中的 enctype 属性是单独给 "上传文件" 来提供的.
2. getPart(String name) 中的 name 不是文件名, 而是 form 表单中的 name 属性.
3. 服务器代码最上方需要加上一个 @MultipartConfig 注解. 可以认为 Servlet 上传文件的功能默认是关闭的, 手动添加上这个注解才能打开文件上传功能.
如果不加上 @MultipartConfig , 运行就会报错:
加上后的正确运行结果:
另外, 本地 D 盘也多了一个文件名为 result.jpg 的图片. 这就相当于我们通过页面将这个图片上传给 Tomcat ,然后 Tomcat 又将这个图片写到本地. 这样就完成了一个上传保存的过程. 只是因为现在浏览器和服务器在同一个主机上, 传来传去, 感觉都是左手倒右手, 没啥区别, 如果浏览器和服务器不在同一个主机上, 那这样的上传文件就是切实有意义的.
通过 fiddler 抓包进行查看报文内容:
请求报文
请求报文中可以看到文件的格式是 multipart/form-data, 然后文件内容的起始和结束位置都一个边界.
响应报文