清空$ _POST和$ _FILES,但非空的php://输入multipart / form-data请求,iOS AFNetworking库

时间:2013-10-14 13:34:24

标签: php ios yii multipartform-data

我正在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();
    }];

1 个答案:

答案 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

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