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

HTTP Post Upload Multiple Files from iOS to PHP

在我的 iOS 应用程序中,我正在构建一个 NSData 用作 NSMutableURLRequest 的正文,以便我可以在一个 HTTP [=39= 中上传多个文件].

我的 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 端,当我收到此 post 时,我只看到了三个文件中的第一个。如果我把名为 "sqlite" 的放在第一位,那么在 PHP 一侧,我只会看到 "sqlite" 文件。如果我把名为 "sqliteshm" 的文件放在第一位,那么我只会在 $_FILES 数组中看到 "sqliteshm" 文件。

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

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

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

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