上载文件的AngularJS put方法不提供任何数据

时间:2019-04-17 08:33:44

标签: javascript php angularjs ajax symfony

我有一个Symfony应用程序,该应用程序在前端使用AngularJS通过POST方法使用ajax上传文件。

有效的POST方法

数据以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方法失败

但是,当我使用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
}

AngularJS put body is empty

问题是,为什么PUT会发生这种情况,而POST不会发生?我该如何解决?我也可以使用POST来更新文件,但这是一个我想避免的解决方案。

存在类似的问题,但没有适当的解决方案可以在使用PUT时解决问题:

Send file using PUT method Angularjs

AngularJS image upload with PUT, possible, how?

Angularjs file upload in put method not working

1 个答案:

答案 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
    });
};