Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Почему не работает Array.from(value) при переводе formData в массив? (https://javascript.ru/forum/misc/85479-pochemu-ne-rabotaet-array-value-pri-perevode-formdata-v-massiv.html)

accountnujen 16.09.2023 03:22

Почему не работает Array.from(value) при переводе formData в массив?
 
https://codepen.io/accountnujen/pen/...N?editors=1111
document.querySelector("form").addEventListener("submit", function (event) {
  event.preventDefault();
  let datar = {};
  const formData = new FormData(this);
  
  for(let [key, value] of formData.entries()) {
    console.log([key, value]);
    if (key === 'inputFile') {
      let arrpair = Array.from(value);
      console.log(arrpair);
      datar[key] = arrpair.map(file => ({
                        name: file.name,
                        type: file.type,
                        size: file.size
                    }));
    } else {
      datar[key] = value;
    }
  }
  console.log(datar);
});



Почему в конечном итоге arrpair пустой, если value содержит в себе file?

voraa 16.09.2023 06:56

Потому, что value не итерируемый и у него нет свойства length.
https://developer.mozilla.org/ru/doc...%D0%B8% 20Set).

Почему не так?

if (key === 'inputFile') {
      datar[key] = {name: value.name, type: value.type, size: value:size};
    } else {


Или все вместе

let datar = Object.fromEntries(formData.entries());


Только зачем бы все это?

Aetae 16.09.2023 08:35

voraa, fromEntries как раз тут не катит, т.к. multipart/form-data создаёт по отдельной записи с одинаковым именем на каждый файл.
Тут нужно юзать formData.getAll() или собирать массив руками.

voraa 16.09.2023 18:11

Цитата:

Сообщение от Aetae
fromEntries как раз тут не катит, т.к. multipart/form-data создаёт по отдельной записи с одинаковым именем на каждый файл.

Тогда и первый вариант не прокатит, т.к у всех файлов будет key === 'inputFile'

Aetae 17.09.2023 06:23

voraa, так в этом и вопрос автора.)

voraa 17.09.2023 11:27

Цитата:

Сообщение от Aetae
voraa, так в этом и вопрос автора.)

Тогда вопрос к автору, что ему нужно.
Можно, если полей с одним именем несколько (не только для file) делать массив значений
что то типа такого
document.querySelector("form").addEventListener("submit", function (event) {
  event.preventDefault();
  let datar = {};
  const formData = new FormData(this);
   
  for(let [key, value] of formData.entries()) {
    console.log([key, value]);
    if (key === 'inputFile') {
        value = {name: value.name, type: value.type, size: value:size};
    }
    if (datar[key] === undefined) {
        datar[key] = value;
    } else {
        if (!Array.isArray(datar[key])) datar[key] = [datar[key]]
        datar[key].push(value);
    }
  }
  console.log(datar);
});


Часовой пояс GMT +3, время: 02:59.