我正在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:路径参数:nil constructBodyWithBlock:^(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)
在NSMutableURLRequest的帮助下,我们通过使用我们自己的多部分POST请求实现解决了iOS上的问题。仍然没有回答为什么我们不能使用AFNetworking或在Postman,Android和AngularJS上放置Content-Type标头。我们强烈认为AFNetworking的问题是发送请求分块(标头transfer-encoding: chunked
)。我们实际上是在我们的自定义iOS实现上发送Content-Type: multipart/form-data
,所以问题根本不是那个标题。
在服务器端,当设置Content-Type标头时使用Postman工具时,我可以通过php://输入验证数据,但是没有到达,php:// stdin,$ _POST和$ _FILES。 / p>
我们没有尝试在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