2015-09-30 15 views
0

在我的iOS應用程序中,我構建了一個NSData作爲NSMutableURLRequest的正文,以便我可以在一個HTTP POST中上傳多個文件。HTTP上傳多個文件從iOS到PHP

我的帖子正文的內容是這樣的(刪除文件數據,只是用字節數代替):

multipart/form-data; charset=utf-8; boundary=0xKhTmLbOuNdArY 
--0xKhTmLbOuNdArY 
Content-Disposition: form-data; name="email" 
[email protected] 
--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」的那個放到第一個,那麼我只能看到$ _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發送多個文件不正確?

回答

1

總之,您的請求無效。

更詳細地說,請注意--0xKhTmLbOuNdArY----0xKhTmLbOuNdArY之間的區別。在末尾--處使用兩個破折號的分隔符是終結符。因此,您的請求主體不會被解析超出第一個終結符,這恰好在第一個文件之後。應該只有一個終結者 - 在請求的最後。

通常,在編寫多部分表單數據請求時,您不應該重新發明輪子。只需使用經過驗證且經過時間考驗的庫,如AFNetworking

+0

我過去曾經遇到過很多ASI問題,當我嘗試轉換爲AFNetworking時,我認爲它適合於ARC轉換,而且事情很奇怪,所以我沒有最終使用它。從那以後,我一直在使用RequestQueue,但RQ沒有文件上傳選項。我使用AFNetworking的podfile安裝,並順利進行,並且他們的代碼也成功上傳了這些文件。謝謝。 –