2013-10-14 57 views
1

我在PHP 5.4(更具體地說,使用Yii Framework)上實現多部分請求,其中2參數是純文本,另一個是圖像文件。問題是,如果我用頭Content-Type: multipart/form-data,當我的要求去做,我得到以下信息

內部服務器錯誤

未定義指數:myTextVar1

使用file_get_contents('php://input')檢查服務器接收參數,我可以看到所有的信息已經到達。但是$ _POST和$ _FILES數組都是空的。

如果我刪除標頭Content-Type,請求工作正常,$ _POST和$ _FILES數組被正確填充。我已經在Postman Chrome工具AngularJS和Android上嘗試過這種情況,每種情況都會發生。

我們在iOS上使用庫AFNetworking,它會自動添加Content-Type標頭,我們希望堅持它,而不是嘗試使用其他解決方案。

是否有任何可能的方法解決這個問題在PHP上,或者我們應該嘗試在iOS上使用替代庫?

編輯:iOS的請求代碼

[sessionManager POST:路徑參數:無 constructingBodyWithBlock:^(ID FORMDATA){

 [formData appendPartWithFormData:[myTextVar1 dataUsingEncoding:NSUTF8StringEncoding] name:@"myTextVar1"]; 

     [formData appendPartWithFormData:[myTextVar2 dataUsingEncoding:NSUTF8StringEncoding] name:@"myTextVar2"]; 

     [formData appendPartWithFileData:dataToUpload name:@"imageAnswer" fileName:@"image.jpg" mimeType:@"image/jpeg"]; 

    } success:^(NSURLSessionDataTask *task, id responseObject) { 
     successBlock(); 
    } failure:^(NSURLSessionDataTask *task, NSError *error) { 
     failureBlock(); 
    }]; 
+0

哪裏是你的代碼? –

+0

'公共函數actionMyRequest(){!is_null($ _ POST [「myTextVar1」]){//已經在這裏崩潰 } } –

+0

但是,不應該定義內容類型是否合乎邏輯?我覺得這個請求很有意思,不需要設置內容類型,但是告訴服務器是多部分的,會導致請求失敗。感謝您的答案無論如何:) –

回答

0

我們已經解決了這個問題在iOS上通過使用我們自己的多部分POST請求的實現,在NSMutableURLRequest的幫助下。儘管如此,這並不能解釋爲什麼我們不能使用AFNetworking,或者將郵件內容類型標頭放在Postman,Android和AngularJS上。我們有強烈的感覺,AFNetworking的問題是發送請求分塊(標題transfer-encoding: chunked)。我們實際上在我們的自定義iOS實施上發送了Content-Type: multipart/form-data,所以不知怎的,問題根本不在於那個標題。

在服務器端,當使用Postman工具設置Content-Type標頭時,我可以通過php://輸入驗證數據,但未達到php:// stdin,$ _POST和$ _FILES。

我們還沒有嘗試在Apache上禁用分塊,但這也可能解決問題。

我在下面留下一些相關的鏈接,可以爲其他人在未來有幫助... https://serverfault.com/questions/142512/problem-with-transfer-encoding-chunked-in-apache-2-2/143965#143965

https://serverfault.com/questions/59047/apache-sending-transfer-encoding-chunked

https://bugs.php.net/bug.php?id=50210