1. 基于 form 表单实现的上传文件
核心方法
HttpServletRequest 类方法
|
方法
| 描述 |
| Part getPart(String name) | 获取请求中给定 name 的文件 |
| Collection<Part> getParts() | 获取所有的文件 |
|
方法
| 描述 |
| 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, 然后文件内容的起始和结束位置都一个边界.
响应报文

博客介绍了基于form表单实现文件上传的方法。阐述了核心方法及HttpServletRequest类方法,给出客户端和服务器代码示例。强调表单enctype属性、getPart方法参数及服务器代码需添加@MultipartConfig注解。还通过fiddler抓包查看报文内容,说明了文件上传保存过程及意义。
1188

被折叠的 条评论
为什么被折叠?



