[英]empty $_POST and $_FILES with request type multipart/form-data
[英]Empty $_POST and $_FILES, but non empty php://input on multipart/form-data request, iOS AFNetworking library
我正在PHP 5.4上實現一個多部分請求(更具體地說,使用Yii Framework),其中兩個參數是純文本,另一個參數是圖像文件。 問題是,如果我使用標題Content-Type: multipart/form-data
,則在執行請求時會收到以下消息
內部服務器錯誤
未定義索引:myTextVar1
使用file_get_contents('php://input')
檢查服務器是否接收到參數,我可以看到所有信息都已到達。 但是$ _POST和$ _FILES數組均為空。
如果我刪除標題Content-Type
,則請求工作正常,$ 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(); }];
在NSMutableURLRequest的幫助下,我們通過使用自己的多部分POST請求實現來解決了iOS上的問題。 但這仍然不能回答為什么我們不能使用AFNetworking或將Content-Type標頭放置在Postman,Android和AngularJS上的原因。 我們強烈感覺到AFNetworking的問題是將請求分塊發送(標頭transfer-encoding: chunked
)。 實際上,我們在自定義iOS實現中發送了Content-Type: multipart/form-data
,所以某種程度上問題根本不是那個標頭。
在服務器端,當使用Postman工具設置Content-Type標頭時,我可以驗證數據是否通過php:// input到達,但沒有到達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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.