首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > PowerDesigner >

thttpd的文件下传

2013-03-25 
thttpd的文件上传工作中需要使用web服务,于是下载了thttpd做服务器。在后期需要增加文件上传功能,经过检查

thttpd的文件上传

工作中需要使用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时,则后面的内容又可能被分成多个子域来容纳不同的信息

 

1楼jszj昨天 15:19
补充:服务器在实际读取上传文件内容的时候,可以先回复客户端,然后再读取内容,我就是这样做的,不过我上传的文件基本不超过20MB,没有试过先收完文件再回复客户端的情况。n客户端测试,使用vs2010,在C#中:nvar client = new WebClient();nclient.UploadFile("http://192.168.2.2", "D:/music/jingle bells.mp3");

热点排行