通过解析HTTP协议自己实现文件上传

时间:2021-08-04 20:29:47

 JSP代码

两个文本输入框,两个上传文件,使用POST提交,这时通过HTTP协议发送的请求是什么样的呢?

通过HTTP协议分析其可以看到

请求行

POST /myupload/uploadDo HTTP/1.1

请求头
Host: localhost:8820
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://localhost:8820/myupload/index.jsp
Cookie: JSESSIONID=D86CEA4F6F230AFBBDAAE54D724F73D0
Content-Type: multipart/form-data; boundary=---------------------------122872775310383
Content-Length: 655

空行

 

消息体

-----------------------------122872775310383
Content-Disposition: form-data; name="txt"

dafdfa
-----------------------------122872775310383
Content-Disposition: form-data; name="txt1"

sdf
-----------------------------122872775310383
Content-Disposition: form-data; name="myfile"; filename="tt.txt"
Content-Type: text/plain

11111111111
222
333333333
1111111
3333333
5444444444
-----------------------------122872775310383
Content-Disposition: form-data; name="myImg"; filename="1.txt"
Content-Type: text/plain

adaaaaaaaaaaa
sbbbbbbbbbbbbbbbb
dddddddddd
daaaaaaaaa
eeeeeeeeee

-----------------------------122872775310383--

和一般的POST请求有什么不一样呢,对了,在消息体中用boundary进行了分割,可以清楚的看到,前两个是文本框中上传的内容,后两个是上传的文件,区别就是在Content-Disposition这行中多了filename这个属性,好了要上传文件下面的任务就是解析这个消息体了,上代码

这段程序只能处理文本文件,要是处理图片就需要使用字节流了。

下面再了解下RFC1867协议

RFC1867协议主要是在HTTP协议的基础上为INPUT标签增加了file属性,同时限定了Form的method必须为POST,ENCTYPE必须为multipart/form-data。当然还增加了一些与此相关属性,但都不是很重要,我们在此不作讨论。