我正在 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