Добавить все данные из формы (включая файлы) в FormData

Я не могу получить правильный синтаксис для добавления файла (или нескольких файлов) при сканировании всех элементов с <form>. Проблемная линия - data.append("PhotosToUpload", TheFile);. Я пробовал много разных способов, но безуспешно.

Ниже приведен минимальный пример кода.

function SendData() {
  var inputs = document.getElementById("MyForm").elements;

  var xhr = new XMLHttpRequest();
  xhr.open('post', 'TheHandler.php', true);
  xhr.onreadystatechange = function() {
    if (xhr.readyState == 4 && xhr.status == 200) {
      document.getElementById("TheResponse").innerHTML = xhr.responseText;
    }
  }

  var data = new FormData;
  for (i = 0; i < inputs.length; i++) {
    if (inputs[i].type === 'file') {
      if (inputs[i].files.length != 0) {
        for (a = 0; a < inputs[i].files.length; a++) {
          var TheFile = inputs[i].files[a];

          ///////// HERE MY PROBLEM ////////////

          data.append("PhotosToUpload", TheFile);
          //For multiple files also I tried:
          //data.append("PhotosToUpload[]", TheFile);
        }
      }
    } else {
      var TheName = inputs[i].name;
      var TheValue = inputs[i].value;
      data.append(TheName, TheValue);
    }
  }
  xhr.send(data);
  return false;
}
<form id = "MyForm" onsubmit = "event.preventDefault(); SendData();">
  <div>Order<input type = "text" name = "Order" value = ""></div>
  <div>SubOrder<input type = "text" name = "SubOrder" value = ""></div>
  <div>Select photo (.jpg) to Upload: <input type = "file" name = "PhotoToUpload" id = "PhotoToUpload" multiple size = "3"></div>
  <input type = "submit" name = "SendD" id = "SendD" value = "Send data" >
</form>

<div id = "TheResponse"></div>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
220
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы слишком усложняете. Вам вообще не нужно думать об отдельных элементах. Просто дайте объекту FormData вашу форму и позвольте ему найти в ней данные.

var form = document.getElementById("MyForm");
var data = new FormData(form);
xhr.send(data);

Обратите внимание, что PHP требует специальных соглашений об именах, когда у вас есть несколько значений для одного и того же имени поля.

name = "PhotoToUpload" должен быть name = "PhotoToUpload[]"

1) Невероятно просто добавлять элементы формы ...! 2) Я не могу получить файл. Если в TheHandler.php я написал foreach($_POST as $key=>$value){echo $key."-".$value."<br>";}, печатаются только Order и SubOrder (т.е. PhotoToUpload отсутствует).

CMArg 02.05.2018 17:53

@CMArg - PHP загружает файлы в $_FILES, а не в $_POST.

Quentin 02.05.2018 18:14

Я все еще новичок ... Вы правы, большое спасибо.

CMArg 02.05.2018 18:17

Другие вопросы по теме