无法组合multipart / form-data请求

时间:2009-10-17 22:29:16

标签: iphone http

我正在尝试在iPhone应用中实现文件上传功能。服务器代码经过测试并在从桌面浏览器上传文件时起作用,因此我开始实现Objective-C客户端代码。我正在手动组装HTTP请求主体,尽管它看起来正确,但它被服务器拒绝(服务器处理程序无法从多部分内容中提取部分)。无奈之下,我已经将表格简化为只有一个参数,但它仍然不起作用。

我已经捕获了网络流量,我可以看到Wireshark也无法解析我的多部分内容(请查看屏幕截图:Firefox requestiPhone request)。我在下面粘贴它,希望你能看到我看不到的错误。

提前致谢。

火狐:

POST /cubepaint/actions/gallery/post HTTP/1.1
Host: [...]
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-GB; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Authorization: Basic [...]
Content-Type: multipart/form-data; boundary=---------------------------20072377098235644401115438165
Content-Length: 180

-----------------------------20072377098235644401115438165
Content-Disposition: form-data; name="deviceId"

12345
-----------------------------20072377098235644401115438165--
HTTP/1.1 200 OK
Date: Sat, 17 Oct 2009 22:09:21 GMT
Server: Apache/2.2.3 (Debian) DAV/2 SVN/1.4.2 mod_python/3.2.10 Python/2.4.4 mod_ssl/2.2.3 OpenSSL/0.9.8c
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

iPhone:

POST /cubepaint/actions/gallery/post HTTP/1.1
Host: [...]
User-Agent: Copenhagen/1.0 CFNetwork/459 Darwin/9.8.0
Content-Type: multipart/form-data; boundary=----------0E7B16E6-CD3D-4213-9B42-07DA30822C74
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Authorization: Basic [...]
Content-Length: 187
Connection: keep-alive

----------0E7B16E6-CD3D-4213-9B42-07DA30822C74
Content-Disposition: form-data; name="deviceId"

00000000-0000-1000-8000-0016CBCC0B61
----------0E7B16E6-CD3D-4213-9B42-07DA30822C74--
HTTP/1.1 200 OK
Date: Sat, 17 Oct 2009 22:04:07 GMT
Server: Apache/2.2.3 (Debian) DAV/2 SVN/1.4.2 mod_python/3.2.10 Python/2.4.4 mod_ssl/2.2.3 OpenSSL/0.9.8c
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

2 个答案:

答案 0 :(得分:1)

您的iPhone版本表示保持活动但未指定长度。不确定这是否足以造成麻烦。

此外,您的服务器是否可以检查它识别的用户代理字符串(例如,对于向后兼容模式)?

我还会在显示CR / LF字符的文本编辑器中比较这两个字符,以确保您获得正确的行结尾。

您可以尝试的另一件事是创建一个简单的网页,执行多部分POST并从iPhone浏览器(而不是Mac浏览器)运行它,然后检查通过网络的标题。或者你可以抓住像ASIHTTPRequest这样的工具包,看看它为多部分帖子生成了什么样的输出(或者只是使用工具包而不是试图编写自己的工具包。)

祝你好运

答案 1 :(得分:1)

通过阅读RFC 2046(MIME规范)解决:多部分消息的部分之间的边界应该包含两个前导' - ,并且最后边界应该另外包含两个尾随' - '。 Firefox请求中请求标头和请求主体的边界不同:

---------------------------20072377098235644401115438165

-----------------------------20072377098235644401115438165

最后一个边界如下:

-----------------------------20072377098235644401115438165--

当原始边界中存在如此多的前导时,你真的无法用眼睛看到这一点。