1

我正在 PHP 5.4 上实现一个多部分请求(更具体地说,使用 Yii 框架),其中 2 个参数是纯文本,另一个是图像文件。问题是,如果我使用 header Content-Type: multipart/form-data,当我发出请求时,我会收到以下消息

内部服务器错误

未定义索引:myTextVar1

用于file_get_contents('php://input')检查服务器是否接收到参数,可以看到所有信息都到了。但是 $_POST 和 $_FILES 数组都是空的。

如果我删除 header Content-Type,请求工作正常, $_POST 和 $_FILES 数组被正确填充。我已经在 Postman Chrome 工具、AngularJS 和 Android 上尝试过,在每种情况下都发生了相同的情况。

我们在 iOS 上使用库 AFNetworking,它会自动添加 Content-Type 标头,我们希望坚持使用它而不是尝试使用其他解决方案。

有没有办法在 PHP 上解决这个问题,或者我们应该尝试在 iOS 上使用替代库?

编辑: iOS 请求的代码

[sessionManager POST:路径参数:无构造BodyWithBlock:^(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();
    }];
4

1 回答 1

0

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

在服务器端,在设置 Content-Type 标头时使用 Postman 工具时,我可以验证数据来自 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

于 2013-10-15T09:27:03.837 回答