我有一个Symfony应用程序,该应用程序在前端使用AngularJS通过POST
方法使用ajax上传文件。
数据以FormData
的形式添加,并且使用了一些angular.identity
魔术来自动填充正确的application/x-www-form-urlencoded; charset=UTF-8
内容类型:
$scope.fileUpload = function (file) {
var fd = new FormData();
fd.append("title", file.title);
fd.append("file", $scope.file);
$http.post('example/upload', fd, {
transformRequest: angular.identity,
headers: {'Content-Type': undefined}
}).then({
// do something
});
};
这按预期方式工作,允许我访问控制器中发布的变量:
// Expects data from a post method
public function postFile(Request $request)
{
$title = $request->get('title');
/** @var $file UploadedFile */
$file = $request->files->get('file');
// data success, all is good
}
但是,当我使用PUT
方法执行完全相同的操作时,我获得了200
成功,但是没有可访问的数据:
$scope.fileUpload = function (file) {
var fd = new FormData();
fd.append("title", file.title);
fd.append("file", $scope.file);
$http.put('example/update', fd, {
transformRequest: angular.identity,
headers: {'Content-Type': undefined}
}).then({
// do something
});
};
// Expects data from a put method
public function putFile(Request $request)
{
$title = $request->get('title');
/** @var $file UploadedFile */
$file = $request->files->get('file');
// the request parameters and query are empty, there is no accessible data
}
问题是,为什么PUT
会发生这种情况,而POST
不会发生?我该如何解决?我也可以使用POST
来更新文件,但这是一个我想避免的解决方案。
存在类似的问题,但没有适当的解决方案可以在使用PUT
时解决问题:
Send file using PUT method Angularjs
答案 0 :(得分:1)
进一步研究之后,这似乎是PHP的核心问题,而不是AngularJS或Symfony中的错误。
问题是PHP PUT和PATCH无法解析请求,因此内容根本不可用。 (您可以在此处阅读更多信息:https://bugs.php.net/bug.php?id=55815)
一种解决方法是使用POST
方法,但将方法伪装成PATCH/PUT
的方法,就像这样:
$scope.fileUpload = function (file) {
var fd = new FormData();
fd.append("title", file.title);
fd.append("file", $scope.file);
fd.append('_method', 'PUT');
$http.post('example/update', fd, {
transformRequest: angular.identity,
headers: {'Content-Type': undefined}
}).then({
// do something
});
};