Servlet 实现上传文件

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

响应报文

 


 

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Master_hl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值