Отправка нескольких файлов в Laravel с использованием Vue.js - PullRequest
0 голосов
/ 06 октября 2018

Я использую многошаговую форму в Vue.js для отправки нескольких файлов на сервер Laravel.Форма дает пользователю возможность добавлять нескольких пользователей в базу данных.Каждый пользователь требует, чтобы файл был загружен вместе с ним.

Файлы изначально сохраняются в состоянии с использованием Vuex.Каждый файл помещается в массив files в store.js

Когда пользователь отправляет форму, массив файлов выглядит следующим образом: enter image description here

Когда пользователь отправляет форму, я добавляю все отдельные данные формы, включая массив файлов, в новый объект FormData () следующим образом:

let fd = new FormData();
// append each file
for( var i = 0; i < store.state.files.length; i++ ){
  let file = store.state.files[i];

  fd.append('files[' + i + ']', file);
  console.log(file);
}
// append rest of form data
fd.append('appointments', store.state.appointments);
fd.append('business_details', store.state.business_details);
fd.append('business_names', store.state.business_names);
fd.append('directors', store.state.directors);
fd.append('share_amount', store.state.share_amount);
fd.append('shareholders', store.state.shareholders);

Как только все данные формы добавлены, я используюAxios для отправки данных формы в мой бэкэнд Laravel.

axios.post('/businesses', fd, {
  headers: {
    'content-type': 'multipart/form-data'
  }
})
.then(response => {
   console.log(response);
   this.completeButton = 'Completed';

})
.catch(error => {
   console.log(error)
   this.completeButton = 'Failed';
})

Внутри моего Laravel BusinessController Затем я хочу Log::debug($_FILES), чтобы увидеть, какие файлы были отправлены вместе, но все, что я получаю, этопустой массив.

[2018-10-05 16:18:55] local.DEBUG: array (
) 

Я проверил, что отправляемые заголовки включают в себя 'multipart/form-data' и что я добавляю все свои данные формы в новую FormData (), но я не могу понять, почему серверполучает пустой массив $ _FILES.

ОБНОВЛЕНИЕ 1: Если я Log::debug($request->all());, я получаю: enter image description here

Если я пытаюсь сохранитьобъекты в этом файле примерно так:

foreach ($request->input('files') as $file) {
  $filename = $file->store('files');
}

Я получаю следующую ошибку:

[2018-10-06 09:20:40] local.ERROR: Call to a member function store() on string

1 Ответ

0 голосов
/ 06 октября 2018

Попробуйте этот случай:

var objectToFormData = function (obj, form, namespace) {

var fd = form || new FormData();
var formKey;

for (var property in obj) {
    if (obj.hasOwnProperty(property)) {

        if (namespace) {
            formKey = namespace + '[' + property + ']';
        } else {
            formKey = property;
        }

        // if the property is an object, but not a File,
        // use recursivity.
        if (typeof obj[property] === 'object' && !(obj[property] instanceof File)) {

            objectToFormData(obj[property], fd, property);

        } else {

            // if it's a string or a File object
            fd.append(formKey, obj[property]);
        }

    }
  }

  return fd;

};

Ссылка: objectToFormData

Axios:

 axios.post('/businesses', fd, {
          transformRequest: [
             function (data, headers) {
                  return objectToFormData(data);
              }
          ]
 })
.then(response => {
   console.log(response);
   this.completeButton = 'Completed';

})
.catch(error => {
   console.log(error)
   this.completeButton = 'Failed';
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...