добавление массива массивов в FormData и отправка через AJAX

#javascript #laravel #form-data

#javascript #laravel #форма-данные

Вопрос:

Мне нужно отправить массив массивов в форме, состоящей из нескольких частей.

 let currentObj = this;
let formData = new FormData();
for (var i = 0; i < this.mediaData.length; i  ) {
  let file = this.mediaData[i];
  console.log(file, "file");
  formData.append('medias['   i   ']', , file.file, file.original_file_name, file.function_name);
}
for (var i = 0; i < this.mud_table.name.length; i  ) {
  let mud = this.mud_table.name[i];
  formData.append('mud_table['   i   ']', mud);
}
formData.append('mud_map_status', this.mud.status);
formData.append('mud_map_id', this.mud.id)
formData.append('surveyReportID', this.survey_reporting_id);
  

с помощью этого кода я могу отправлять только свойство files file из массива mediasData в контроллер.

 mediasData:[function_name:mud_pdf1; original_file_name: recipt_pdf.pdf; file:{File},
function_name:mud_pdf2; original_file_name: recipt_pdf.pdf; file:{File},
function_name:mud_pdf3; original_file_name: recipt_pdf.pdf; file:{File}]
  

находится в этом формате, и в серверной части я получаю только medias:[file:{File}] формат в запросе.
мне также нужно отправить свойства «original_file_name» и «function_name». конечно, я мог бы разбить массив на 3 части и добавить их по отдельности, но есть ли какой-либо способ отправить все свойства каждого индекса массива mediasData в соответствующий индекс массива formdata?

Комментарии:

1. Я не вижу здесь вложенных массивов. Кроме того, ваш mediasNames бит выглядит очень странно. Не могли бы вы объяснить, какие данные вы хотите отправить?

2. mideasName был моим мошенническим способом фактически отправить массив function_name в контроллер. но мне также нужно добавить его к переменной mideas

Ответ №1:

FormData позволяет указывать имя файла при добавлении файлов, так что это должно позаботиться о вашей original_file_name собственности.

 formData.append(`medias[${i}]`, file.file, file.original_file_name)
  

Это может быть прочитано PHP в $_FILES['medias']['name'][$index] или любой другой соответствующей абстракции Laravel. Я уверен, что он поддерживает имя файла.

Что касается других ваших полей, ваш единственный реальный вариант — добавить новый массив с соответствующими индексами. Похоже, вы пытались сделать это с mediasNames , но это должно выглядеть больше как

 formData.append(`mediaFunctionNames[${i}]`, file.function_name)
  

Подводя итог

 let formData = new FormData();
this.mediaData.forEach((file, i) => {
  formData.append(`medias[${i}]`, file.file, file.original_file_name)
  formData.append(`mediaFunctionNames[${i}]`, file.function_name)
})
this.mud_table.name.forEach((mud, i) => {
  formData.append(`mud_table[${i}]`, mud)
})
  

Комментарии:

1. спасибо, что поделились этой информацией @phil. кажется, у меня нет возможности каким-то образом объединить эти массивы в серверной части, вместо этого пытаясь отправить их все сразу. И я забыл упомянуть, что я использовал vue.js для этого.