解析HTTP协议实现文件上传

本文介绍了在C/S架构下如何处理文件上传,重点在于理解multipart/form-data格式。通过分析请求流,展示了文件和表单字段在请求中的结构,并给出了服务端接收文件的Servlet示例代码。在实现过程中,注意结束分隔符的重要性,避免出现"Stream ended unexpectedly"的错误。提供了一个工具类源码下载,适用于JAVA和Android项目。
摘要由CSDN通过智能技术生成

在J2EE开发中,使用浏览器上传文件很简单,服务器用Apache的Commons FileUpload实现就可以了。但是在开发C/S架构的程序时就需要自己处理。用代码实现文件上传需要对表单的multipart/form-data有所了解。

表单默认情况下使用 application/x-www-form-urlencoded ,在multipart/form-data中Content-Type是这样的:

Content-Type: multipart/form-data; boundary=--******

boundary是表示分隔,用于分隔多个文件。格式是 – 后面可以跟随一串随机数。

我自己写了一个Servlet,使用jsp表单提交,打印出request中的流,用于分析格式。

JSP源码:

后台接收:

输出打印:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0oz5esa4-1623077373057)(http://s3.engr-z.com/wp/2021/20160223120840.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k1KOupuh-1623077373060)(http://s3.engr-z.com/wp/2021/20160223120854.png)]

分析

  1. 如果提交的内容是文件,那么格式如下
------WebKitFormBoundaryxHKqg3ljAsuAFWBO
Content-Disposition: form-data; name="upfile"; filename="test.png"
Content-Type: image/png
(二进制内容省略...)
------WebKitFormBoundaryxHKqg3ljAsuAFWBO

其中Content-Type是文件类型,这个是浏览器自己判断的。

  1. 如果提交的内容是表单字段,那么格式如下
------WebKitFormBoundaryxHKqg3ljAsuAFWBO
Content-Disposition: form-data; name="note"
字段内容
------WebKitFormBoundaryxHKqg3ljAsuAFWBO

所有文件或字段的分隔用

------WebKitFormBoundaryxHKqg3ljAsuAFWBO

当执行到未尾,最后一个分隔要加上"–-"

------WebKitFormBoundaryxHKqg3ljAsuAFWBO--

当时自己实现时忽略掉这个–,导致代码一直报错:org.apache.commons.fileupload.FileUploadException: Processing of multipart/form-data request failed. Stream ended unexpectedly

分析完multipart/form-data的格式后,自己写代码就比较容易了。

  • 客户端发送

  • 服务端接收

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fc5VEV7E-1623077373063)(http://s3.engr-z.com/wp/2021/20160223121631.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lqmPwjWV-1623077373064)(http://s3.engr-z.com/wp/2021/20160223121638.png)]

源码下载:s3.engr-z.com/wp/2021/uploadfile.zip

该工具类可以用于JAVA或Android。

本文原是2016年写的,更换域名和博客后旧文章未迁移过来。考虑到还有一定参考价值,特别整合收录到本站。
旧链接:https://wangzhengzhen.com/523.html


除非注明,否则均为"攻城狮·正"原创文章,请注明出处。

本文链接:https://engr-z.com/408.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值