FormData() input[type=file]

184
04 мая 2019, 13:40

https://codepen.io/Galtran/pen/BGYRoX?editors=1011

<form id="form" action="#" method="POST" enctype="multipart/form-data">
    <p>
        <label for="upload">Прикрепить файл</label>
        <input id="upload" name="upload" type="file" accept="image/png" multiple>
    </p>
    <p>
        <label for="name1">Имя</label>
        <input id="name" name="name" type="text" placeholder="Name" pattern="[A-zА-яЁё]{3,}" required>
    </p>
    <p>
        <label for="tel">Телефон</label>
        <input id="tel" name="tel" type="tel" placeholder="8-123-456-78-90" required>
    </p>
    <button type="submit">Отправить</button>
</form>
'use strict';
var form = document.querySelector('#form'),
     upload = form.querySelector('#upload'),
     username = form.querySelector('#name'),
     tel = form.querySelector('#tel');
var onFormSubmit = function (evt) {
      evt.preventDefault();
      var formData = new FormData(form);
      // var formData = new FormData();
      // var uploadValue = upload.files,
      //   nameValue = username.value,
      //   telValue = tel.value;
      // formData.append('upload', uploadValue);
      // formData.append('name', nameValue);
      // formData.append('tel', telValue);
      var request = new XMLHttpRequest();
      request.addEventListener('load', function () {
        if (request.status === 200) {
          console.log(request.response);
        } else {
          console.log('Статус ответа: ' + request.status + ' ' + request.statusText);
        }
      });
      request.addEventListener('error', function () {
        console.log('Произошла ошибка соединения');
      });
      request.addEventListener('timeout', function () {
        console.log('Запрос не успел выполниться за ' + request.timeout + 'мс');
      });
      request.timeout = 10000;
      request.open("POST", "#");
      request.send(formData);
    };
    form.addEventListener('submit', onFormSubmit);

Несколько вопросов:

  1. В конструктор FormData передаю аргументом форму. В отладчике ставлю точку останова и ожидаю увидеть в переменной formData пары ключ-значения инпутов формы, но там пустой конструктор FormData{}. Если (раскомментировать) передать в переменную formData = FormData() без аргумента и добавить значения самостоятельно, то они там появляются, как свойства объекта formData. Кроме списка загруженных файлов. В первом варианте так и должно быть? И как себя проверить, что нужные данные попали в форму?

  2. Атрибут input[type=file] - accept="image/png" Я так понял, что это не валидация, а что-то, вроде, фильтра в диалоговом окне загрузки. Т.е. валидацию надо делать самостоятельно.

  3. стр 5 и стр 15 в js. переменная username была названа просто name и в отладчике nameValue возвращало undefined. Пока не понял, с чем это связано.

  4. Есть ли какой-нибудь тестовый сервер для проверки или как себя проверить, что нужные данные правильно отправлены?

Answer 1
  1. То, что в объекте FormData есть значение вы можете проверить так

    console.log(formData.get('name'))

Это самый простой способ. Кроме того, при отправке данных во вкладке Network вы сможете увидеть все поля, которые передала форма.

  1. Да, в диалоговом окне будет доступны для выбора только *.png файлы.
  2. Вопрос не совсем понятен: ваш код выведет значение nameValue в консоль, если его раскомментировать(и добавить console.log('nameValue', nameValue); )
  3. Так же как и в вопросе 1 - вы можете посмотреть всё, что ушло на сервер во вкладке Network отладчика
READ ALSO
В чем разница в объектах? [дубликат]

В чем разница в объектах? [дубликат]

На данный вопрос уже ответили:

133
Извлечь данные при парсинге Node.js

Извлечь данные при парсинге Node.js

При парсинге я получаю ответ в таком виде:

124
Отображать children при v-html (vue)

Отображать children при v-html (vue)

В своем vue-компоненте я использую следующую конструкцию:

180
Как передать методом post ответы на вопросы?

Как передать методом post ответы на вопросы?

Вообщем друзья помогите есть такой вот код:

163