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>

В файле services я отправляю его, используя следующее:

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

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


person omarsafwany    schedule 11.08.2015    source источник
comment
Какой у вас браузер?   -  person danial    schedule 13.08.2015
comment
Несколько файлов должны работать в браузерах html5. Возможно, вам потребуется изменить код сервера. Чтобы убедиться, что он работает, перейдите на вкладку сети вашего браузера и запросите содержимое, чтобы убедиться, что оба файла отправляются на сервер в теле запроса.   -  person danial    schedule 13.08.2015


Ответы (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 }

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

person Bill Jia    schedule 25.08.2015