空 $_POST 和 $_FILES,但在多部分/表单数据请求、iOS AFNetwork 库上为非空 php://in


Empty $_POST and $_FILES, but non empty php://input on multipart/form-data request, iOS AFNetworking library

我正在 PHP 5.4 上实现一个多部分请求(更具体地说,使用 Yii 框架),其中 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请求的代码

[会话管理器发布:路径参数:无 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();
    }];
我们已经在

iOS 上解决了这个问题,方法是在 NSMutableURLRequest 的帮助下,使用我们自己的多部分 POST 请求实现。这仍然没有回答为什么我们不能使用AFNetworking或将Content-Type标头放在Postman,Android和AngularJS上。我们有一种强烈的感觉,AFNetworking的问题在于发送分块的请求(标头transfer-encoding: chunked)。我们实际上在自定义iOS实现上发送Content-Type: multipart/form-data,因此不知何故,问题根本不在于该标头。

在服务器端,在设置内容类型标头时使用邮递员工具时,我可以验证数据是否通过 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

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