现在的位置: 首页 > 综合 > 正文

thttpd的文件上传

2012年10月03日 ⁄ 综合 ⁄ 共 1420字 ⁄ 字号 评论关闭

工作中需要使用web服务,于是下载了thttpd做服务器。

在后期需要增加文件上传功能,经过检查发现,thttpd中没有这个功能,所以需要添加上来,基于本身的框架,很快就加上来了,以下是对httpd协议文件上传的理解过程,做一记录。

 

注:本文章真对文件上传的部分说明,所以其它情况下的协议的不同之处,在此基本没有涉及到,具体的不同,可以参考其它文献。

 

httpd协议以文本字符串为命令组织,文件上传以POST方式提交内容。以下为工作中用到的http协议内容,其实还有很多其它的没有用到,在此不做讨论

 

POST /UploadFW/ HTTP/1.1
Content-Type: multipart/form-data; boundary=---------------------8cff3a9221c298b
Host: 192.168.2.81
Content-Length: 1564167
Expect: 100-continue

 

-----------------------8cff3a9221c298b
Content-Disposition: form-data; name="file"; filename="jingle bells.mp3"
Content-Type: application/octet-stream

 

<这里是要上传的文件内容>

 

-------------------------8cff3a9221c298b--

 

各域的说明:

首先注意的是,上面的几行中,四个回车换行符不能少的,即必需存在,各信息块之间必需使用空行隔开。

Content-Type,普通的请求,其值为 text/xml,而文件上传时,其值的格式为:multipart/form-data; boundary=---------------------8cff3a9221c298b,其中boundary的值是一个随机生成的分隔符,在后面以此分隔符表示各域的内容。

Content-Length,本次post提交的内容的长度,是除了httpd头之外的所有内容的长度,也包括分隔符在内,所以对于实际文件的长度,服务器必需通过计算来获取得,在本字段的值的基础之上,把分隔符及后面的那些头以及最后的[回车换行-分隔符-回车换行]的长度都除去才是最终的文件内容长度。

第一个空行之后的“-----------------------8cff3a9221c298b”,即是boundary的值,但和这个值相比,前面多了两个"--",即多了2个字节,后面的行指明上传文件的状况,比如文件名(没有包含路径)。在本分隔符的域之后,加上回车换行之后,开始真正的文件内容。

最后的分隔符“-------------------------8cff3a9221c298b--”,这里必需注意的是它的长度,除去回车换行符之后,如果boundary的值是"A",则第一个分隔符是“--A”,而这个结束的分隔符是“--A--”,通过多次对比,才发现了这个不同。

如果是网页上的form提交,则这个分隔符好像是多个,有多少个字段就有多少个分隔符把它们分开,都在文件内容的前面,每个分隔符的前面都有空行间隔。

 

由于http协议是文本格式,所以其协议中的空行非常重要,从收到的内容开始算,到第一个空行为止,为总的httpd协议头,其中可以包含很多的内容,而有POST时,则后面的内容又可能被分成多个子域来容纳不同的信息

 

抱歉!评论已关闭.