【问题标题】:Unable to assemble multipart/form-data request无法组装多部分/表单数据请求
【发布时间】:2009-10-19 03:56:12
【问题描述】:

我正在尝试在 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

【问题讨论】:

    标签: iphone http


    【解决方案1】:

    您的 iPhone 版本指示保持活动状态,但未指定长度。不确定这是否足以引起麻烦。

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

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

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

    祝你好运

    【讨论】:

    • 你也可以看看发布的截图吗?有 CR/LF 突出显示,也许你可以给我一个线索。此外,两个版本中似乎都指定了 Content-Length,因此不确定“未指定长度”是什么意思。
    • 我的意思是“Keep-Alive: 300”——你的 iPhone 样本没有 keepalive 时间长度,即使它指定了“Connection: keep-alive”——你永远不知道,但是我认为这不足以导致破损。您在此处列出的屏幕截图由 SO 进行了文本处理和格式化,它们看起来都很好。您可能需要检查原始输出。但首先要尝试的是比较 MobileSafari(或 ASIHTTPRequest)与您的代码的输出。
    【解决方案2】:

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

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

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

    最后一个边界是这样的:

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

    当原始边界中有这么多前导“-”时,您真的无法用肉眼看到这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-18
      • 2014-09-21
      • 2019-06-01
      • 2020-10-12
      • 2012-11-27
      • 2016-12-17
      • 2012-03-16
      • 2016-11-11
      相关资源
      最近更新 更多