AngularJs: загрузка нескольких файлов из разных источников

Я пытаюсь загрузить два разных файла, изображение и PDF-файл, каждый из которых выглядит следующим образом:

<div class="form-group" ng-class="libraries.error.img[0] ? 'has-error' : ''">
     <label for="img">Image</label>
     <input type="file" accept="image/*" ngf-select="" ngf-multiple="true"  class="form-control" id="img" name="img" placeholder="Image" ng-model="libraries.library.img">
     <p ng-if="libraries.error.img[0]" style="color: red">{{libraries.error.img[0]}}</p>
</div>

<div class="form-group" ng-class="libraries.error.document[0] ? 'has-error' : ''">
     <label for="document">Document</label>
     <input type="file" accept="application/pdf" ngf-select="" class="form-control" id="document" name="document" placeholder="Document" ng-model="libraries.library.document">
     <p ng-if="libraries.error.document[0]" style="color: red">{{libraries.error.document[0]}}</p>
</div>

В файле служб я отправляю его с помощью следующего:

store: function (library) {
       console.log(library);
       return  Upload.upload({
       url: 'api/libraries',
       method: 'POST',
       fields: {name: library.name, location: library.location},
       file: [library.img, library.document]
         });
       },

Но когда я пытаюсь получить файлы на стороне сервера следующим образом:

return $_FILES;

Я продолжаю получать:

[] No Properties

Однако, когда я изменяю файл на

file: library.img

имеется ввиду, я передаю только один файл, все работает.

я использую ng-file-upload с AngularJS и на стороне сервера Laravel

Любая идея, чтобы решить эту проблему, позволяя оба файла для отправки на сервер?!

1 ответ

У меня была та же проблема, и я смог ее исправить, дав объекту JSON для каждого файла свое имя (черпая вдохновение отсюда). Если бы я не переименовал объекты, сервер получил бы правильное количество файлов, но все они были бы идентичны. Так что если вы примените это, ваш код будет:

store: function (library) {
   console.log(library);
   return  Upload.upload({
   url: 'api/libraries',
   method: 'POST',
   fields: {name: library.name, location: library.location},
   file: [library.img, library.document]
   fileFormDataName: [name1, name2]
     });
   },

Я считаю, что имена могут быть любыми, если они уникальны. Однако теперь вы должны обрабатывать объекты отдельно на стороне вашего сервера. Я не знаком с тем, как вы могли бы сделать это в PHP, но на моем бэкэнде Rails я могу собрать все файлы по их классу:

files = params.values.find_all { |value| value.class == ActionDispatch::Http::UploadedFile }

Затем я просто назначаю каждому файлу соответствующий атрибут моей модели.

Другие вопросы по тегам