Метод ввода AngularJS для загрузки файлов не дает данных - PullRequest
1 голос
/ 17 апреля 2019

У меня есть приложение Symfony , которое использует AngularJS на внешнем интерфейсе для загрузки файлов с помощью ajax с помощью метода POST.

Рабочий метод 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:

Отправка файла с использованием метода PUT Angularjs

Загрузка изображения AngularJS с PUT, возможно, как?

Загрузка файла Angularjs in put не работает

1 Ответ

2 голосов
/ 17 апреля 2019

После углубления в это, похоже, это основная проблема 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
    });
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...