Я использую ajax для отправки составной формы с массивом, текстовыми полями и файлами.
Я добавляю каждую переменную к основным данным так
var attachments = document.getElementById('files');
var data= new FormData();
for (i=0; i< attachments.files.length; i++){
data.append('file', attachments.files[i]);
console.log(attachments.files[i]);
data.append ('headline', headline);
data.append ('article', article);
data.append ('arr', arr);
data.append ('tag', tag);
затем я использую функцию ajax, чтобы отправить его в файл PHP для хранения внутри базы данных sql.
$.ajax({
type: "post",
url: 'php/submittionform.php',
cache: false,
processData: false,
contentType: false,
data: data,
success: function(request) {$('#box').html(request); }
})
Но на стороне PHP arr
переменная, которая представляет собой массив, отображается как строка.
Когда я не отправляю его с помощью ajax как данные формы, но использую простой $.POST
вариант, я получаю его как массив на стороне PHP, но тогда я также не могу отправлять файлы.
какие решения?
javascript
ajax
arrays
form-data
Шульц
источник
источник
Вы также можете отправить массив
FormData
следующим образом:Таким образом, вы можете писать так
arr[]
же, как и в простой HTML-форме. В случае PHP это должно работать.Вы можете найти эту статью полезной: Как передать массив в строке запроса?
источник
arr[]
вformData.append('arr[]', arr[i]);
? почему неarr
правильно? Я пробовал оба, но толькоarr[]
сработало.arr
вы просто переопределяете это значение на каждой итерации цикла, и в конце концов, конечное значение будет равно последнему элементу массива, но не всему массивуarr[]
, почему неarr[]
переопределено?arr[]
также является строкой. И при тестировании в моем случае ни одно,arr
ни другое неarr[]
было переопределено. У меня есть несколько массивов в FormData с тем же ключом, но с другим значением. Итак, я получилarr
с ценностью,1
а другойarr
с ценностью2
.arr
также работал с массивами. В этой теме есть более развернутый ответ на этот вопросfor (var i = 0; i < myArr; i++) { var myItemInArr = myArr[i]; for (var prop in myItemInArr) { fileData.append(`myArr[${i}][${prop}]`, myItemInArr[prop]); } }
Это старый вопрос, но недавно я столкнулся с этой проблемой при публикации объектов вместе с файлами. Мне нужно было публиковать объект с дочерними свойствами, которые также были объектами и массивами.
Функция ниже будет проходить через объект и создавать правильный объект formData.
Это преобразует следующий json -
в следующие FormData
источник
(value !== null) && formData.append(key, value)
а не простоformData.append(key, value)
иначе, он не работает при нулевых значенияхВерсия машинописного текста:
С помощью:
источник
добавить все входные данные типа в FormData
источник
Если у вас есть вложенные объекты и массивы, лучший способ заполнить объект FormData - использовать рекурсию.
источник
Следующая версия действительна для модели, содержащей массивы простых значений:
источник
На основе ответа @YackY более короткая версия рекурсии:
Пример использования:
Отправленные данные:
источник