在我的iOS应用中,我构建NSData
作为NSMutableURLRequest
的正文,以便我可以在一个HTTP POST中上传多个文件。
我的帖子正文的内容看起来像这样(删除了文件数据,只是用字节数替换):
multipart/form-data; charset=utf-8; boundary=0xKhTmLbOuNdArY
--0xKhTmLbOuNdArY
Content-Disposition: form-data; name="email"
myemailaddress@gmail.com
--0xKhTmLbOuNdArY
Content-Disposition: form-data; name="sqlite"; filename="backup.MyApp.v1.1.3-to-v1.1.3.1443578420.sqlite"
Content-Type: application/octet-stream
// ... data length: 880640
--0xKhTmLbOuNdArY--
Content-Disposition: form-data; name="sqliteshm"; filename="backup.MyApp.v1.1.3-to-v1.1.3.1443578420.sqlite-shm"
Content-Type: application/octet-stream
// ... data length: 32768
--0xKhTmLbOuNdArY--
Content-Disposition: form-data; name="sqlitewal"; filename="backup.MyApp.v1.1.3-to-v1.1.3.1443578420.sqlite-wal"
Content-Type: application/octet-stream
// ... data length: 3901672
--0xKhTmLbOuNdArY--
但是,在收到这篇文章的PHP方面,我只看到了三个文件中的第一个。如果我把一个名为" sqlite"首先,然后在PHP方面,我只看到" sqlite"文件。如果我把一个名为" sqliteshm"首先,我只看到" sqliteshm"文件在$ _FILES数组中。
array (
'sqliteshm' =>
array (
'name' => 'backup.MyApp.v1.1.3-to-v1.1.3.1443578420.sqlite-shm',
'type' => 'application/octet-stream',
'tmp_name' => '/private/var/tmp/phpk1wyWb',
'error' => 0,
'size' => 32768,
),
)
文件大小匹配,无论我放在哪一个,但只有第一个文件出现在PHP端。
为了在PHP端接收多个文件,我是否需要做一些特别的事情?
或者我从iOS发送多个文件不正确?
答案 0 :(得分:1)
简而言之,您的请求无效。
更详细地说,请注意--0xKhTmLbOuNdArY--
和--0xKhTmLbOuNdArY
之间的区别。在末尾--
使用两个破折号的分隔符是终结符。因此,您的请求主体不会被解析超出第一个终结符,这恰好在第一个文件之后。应该只有一个终结符 - 在你的请求的最后。
通常,在编写多部分表单数据请求时,您不应该重新发明轮子。只需使用经过验证且经过时间考验的库,例如AFNetworking
。