HTTP Post将多个文件从iOS上传到PHP

时间:2015-09-30 03:06:08

标签: php ios sqlite http-post multipartform-data

在我的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发送多个文件不正确?

1 个答案:

答案 0 :(得分:1)

简而言之,您的请求无效。

更详细地说,请注意--0xKhTmLbOuNdArY----0xKhTmLbOuNdArY之间的区别。在末尾--使用两个破折号的分隔符是终结符。因此,您的请求主体不会被解析超出第一个终结符,这恰好在第一个文件之后。应该只有一个终结符 - 在你的请求的最后。

通常,在编写多部分表单数据请求时,您不应该重新发明轮子。只需使用经过验证且经过时间考验的库,例如AFNetworking