Подтвердить что ты не робот

Загрузите несколько файлов через AngularJS в Laravel Controller


У меня есть

введите описание изображения здесь

Кнопка просмотра файлов

<input type="file" upload-files multiple />

Кнопка создания

<button class="btn btn-link" ng-click="store()" >Create</button>

Директива

myApp.directive('uploadFiles', function () {
    return {
        scope: true,
        link: function (scope, element, attrs) {
            element.bind('change', function (event) {
                var files = event.target.files;
                for (var i = 0; i < files.length; i++) {
                    scope.$emit("seletedFile", { file: files[i] });
                }
            });
        }
    };
});

Прослушать выбранный файл

$scope.files = [];
$scope.$on("seletedFile", function (event, args) {

    console.log("event is ", event);
    console.log("args is ", args);

    $scope.$apply(function () {
        $scope.files.push(args.file);
    });

});

Опубликовать данные и выбранные файлы.

$scope.store = function() {

    $scope.model = {
      name: $scope.name,
      type: $scope.type
    };

    $http({
        method: 'POST',
        url: '/image/store',
        headers: { 'Content-Type': undefined },
        transformRequest: function (data) {
            console.log("data coming into the transform is ", data);
            var formData = new FormData();
            formData.append("model", angular.toJson(data.model));
            for (var i = 0; i < data.files; i++) {
                formData.append("file" + i, data.files[i]);
            }
            return formData;
        },

        data: { model: $scope.model, files: $scope.files }

    })


    .then(function successCallback(response) {
        console.log("%cSuccess!", "color: green;");
        console.log(response);
        $scope.refresh();
        $scope.showModal = false;
        }, function errorCallback(response) {
        console.log("%cError", "color: red;");
        console.log(response);
    });
};

Результат

В моей консоли я не вижу, чтобы мои файлы попадали на мой контроллер в фоновом режиме.

array:1 [
  "model" => "{"type":"wedding"}"
]

Вопросы

Какие шаги я забыл?

Как бы это сделать и отладить это дальше?


4b9b3361

Ответ 1

Я сделал несколько проектов angular 1, а также обнаружил, что загрузить файлы через $http api не так просто. Надежды ниже фрагмента кода, который я использовал в своих проектах, могут вам помочь.

$scope.store = function() {
  var formData = new FormData();

  // add normal properties, the name should be the same as
  // what you would use in a html form
  formData.append('model[name]', $scope.name);
  formData.append('model[type]', $scope.type);

  // add files to form data.
  for (var i = 0; i < $scope.files; i++) {
    formData.append('file' + i, $scope.files[i]);
  }

  // Don't forget the config object below
  $http.post('/image/store', formData, {
    transformRequest: angular.identity,
    headers: {'Content-Type': undefined}
  }).then(function() {
    // ...
  });
};

Ответ 2

Вот несколько предложений для вас:

  • Установите Content-type в multipart/form-data, чтобы установить тип содержимого как-то вроде... "он имеет определенную роль в нем, убедитесь, что вы правильно его поняли.
  • Использовать Axios. Здесь рабочие примеры (если вы не использовали Axios, этот пример тоже хорош). Пример для Axios при загрузке файла.

Ответ 3

Вместо этого вы можете использовать FormData​​p >

var formData = new FormData();

  formData.append('model[var]', $scope.var);

  // For add to the FormData other file
  for (var i = 0; i < $scope.files; i++) {
    formData.append('file' + i, $scope.files[i]);
  }

 // POST REQUEST MUST BE:
  $http.post('url', formData, {
    transformRequest: angular.identity,  //It is for allowing files
    headers: {'Content-Type': undefined}
    }).then(function(response) 
  {
    // verify if response get 200
  });

Ответ 4

Я не очень разбираюсь в Angular, поэтому я предполагаю, что ваш front-end работает.

Отладочный совет Создайте файл PHP, который называется... Я не знаю... file_dump.php. В этом файле введите этот код:

<?php
    echo "<pre>"
    print_r($_REQUEST)
    echo "</pre>"
?>

и отправьте свою форму. Это покажет вам все ваши данные запроса. Если вы не видите свои файлы на выходе, это проблема с вашим JavaScript. Поскольку я не так хорош в Angular, я собираюсь указать вам на эту ссылку: ссылка на несколько учебников по загрузке файлов с помощью Angular. Эти ребята, похоже, знают, что они делают.

Если вы видите свои файлы в файле file_dump.php, это проблема с вашим бэкэнд - Laravel. Это, я могу вам помочь, но мне нужно, чтобы ваши сценарии для меня были полезными в этом аспекте.

Пожалуйста, опубликуйте результаты file_dump.php.

Также вы используете правильные методы для извлечения файлов? Ссылка. Если нет, то мы нашли нашего виновника...

= D
Pranav

Ответ 5

Это моя директива:

app.directive('fileModel', ['$parse', 'message', function ($parse, message) {
    return {
        restrict: 'A',
        link: function (scope, element, attrs) {

            var model = $parse(attrs.fileModel);
            var modelSetter = model.assign;

            //This part is for validate file type in current case must be image
            element.bind('change', function (e) {
                if (attrs.onlyImages == 'true') {
                    if (element[0].files[0].name.substring(element[0].files[0].name.lastIndexOf('.')) != '.jpg'
                        && element[0].files[0].name.substring(element[0].files[0].name.lastIndexOf('.')) != '.jpeg'
                        && element[0].files[0].name.substring(element[0].files[0].name.lastIndexOf('.')) != '.png'
                        && element[0].files[0].name.substring(element[0].files[0].name.lastIndexOf('.')) != '.gif'
                        && element[0].files[0].name.substring(element[0].files[0].name.lastIndexOf('.')) != '.bmp'
                    ) {
                        message.error("This field only accept files of type images(jpg,png)");
                        element.attr('is_valid', false);
                        return false;
                    } else {
                        element.attr('is_valid', true);
                    }
                }
                scope.$apply(function () {
                    modelSetter(scope, element[0].files[0]);
                });
            });
        }
    };
}]);

html:

<input type="file" only-images="true" file-model="data.image" >

И фрагмент Js Controller:

 var fd = new FormData();
 fd.append('fileImage', data.image);

 $http.post('http://url.com', fd, {
                transformRequest: angular.identity,
                headers: {'Content-Type': undefined,}
            })

На laravel, чтобы получить и скопировать изображение: ясно в документах

https://laravel.com/docs/5.4/requests#files