2011-03-11 232 views
1

我目前正在从服务器上接收从客户端上传的图像。客户端可以通过http形式发送图像,如下所示。通过http接收二进制数据

<form method="post" action="http://localhost:7074" enctype="multipart/form-data"> 
<input type="file" name="myfile"> 
<input type="submit"> 
</form> 

在我的服务器端,我遵循关于创建套接字和侦听连接的beej教程。一旦从客户端上传的图像,这是从缓冲区读取我的服务器:

POST/HTTP/1.1 
Host: localhost:7074 
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.15) Gecko/20110303 Ubuntu/10.10 (maverick) Firefox/3.6.15 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 115 
Connection: keep-alive 
Content-Type: multipart/form-data; boundary=---------------------------13305569846927610321194789130 
Content-Length: 3273 

-----------------------------13305569846927610321194789130 
Content-Disposition: form-data; name="myfile"; filename="0-adidas-logo.jpg" 
Content-Type: image/jpeg 

���� 

从接收到的数据,我推测,开始部分是HTTP头和实际的二进制数据,我的形象是在“Content-Type:image/jpeg”之后。所以我打印了其余的buf文件并保存为jpeg文件,但是当我打开它时,出现错误“在状态201中错误地调用jpeg库。所以我想知道是否有任何问题我早先提到的,因为我在这个阶段打了一段时间的步骤。

+0

请添加代码有人能帮你。 是否按照http头中收到的Content-Length字段保存到文件中(通常文件不是一次全部发送,而是分成几个包)? – 2011-03-11 13:14:03

+1

需要注意的一件事是HTTP标头以\ r \ n结尾。确保你没有将\ n或\ r \ n写入jpeg。 – 2011-03-11 14:48:23

+2

我强烈建议你使用库来做到这一点,而不是写你自己的。 – Ben 2011-04-02 06:49:47

回答

0

引用您的HTTP响应,

的“表单数据”边界头端接一个\ r \ n 之后的数据就是你的二进制数据

二进制数据在下一次发生'边界'时终止' - '

如:

-----------------------------13305569846927610321194789130-- 

的数据大小是从\ r \ n向边界之前的最后一个字节的一切。

其他因素是邮政的http头有一个内容大小。这是针对包含多部分部分的所有内容。

了解更多关于此处理表格数据(参见3.3节使用的multipart/form-data的的):

http://www.ietf.org/rfc/rfc1867.txt 

和内容处置

http://www.ietf.org/rfc/rfc2183.txt 
相关问题