Servlet 实现上传文件

2023-11-07

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, 然后文件内容的起始和结束位置都一个边界.

响应报文

 


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Servlet 实现上传文件 的相关文章