Как сделать отправку файла на сервер одной кнопкой из HTML?

На моей веб-странице есть кнопка, по которой я хочу выбрать файл на диске и отправить его на веб-сервер. Я реализовал механизм так:

  1. добавил в код веб-страницы невидимую форму

<form action="index.php" method="post" enctype="multipart/form-data">
    <input type="file" name="upFile" id="fileName" style="display:none">
    <input type="submit" name="file" id="fileUpload" value="upload" style="display:none">
</form>

  1. По нажатию моей кнопки вызываю javascript функцию, которая программно кликает сначала на input запроса файла fileName, а потом на input отправки файла fileUpload

function sendFile()
{
    // Ищем элемент fileName - это диалог выбора файла
    var fileElem = document.getElementById("fileName");
    if (fileElem)
        fileElem.click();   // Запускаем диалог выбора файла
    // Ищем элемент fileUpload - это кнопка отправки формы
    const fileUpload = document.getElementById("fileUpload");
    if(fileUpload)
        fileUpload.click(); // Отправляем форму с файлом
}

Как оказалось, клик по кнопке выбора файла - неблокирующий, и в то время, когда показывается диалог выбора, уже отправляется форма с пустыми данными. Я пробовал следующие варианты:

  • задержка на 3 секунды после вызова диалога выбора файла. Если успеть выбрать файл за 3 секунды, то все работает, но пользоваться неудобно.
  • отслеживание закрытия окна диалога. Закрытие отслеживается, но функционал не работает - все равно отправляется пустая форма.
  • мониторинг состояния формы через observer. Не работает - не вызывается коллбэк. Возможно, что-то не так сделал. Код прилагаю.

// Выбираем целевой элемент
var fileElem = document.getElementById("fileName");
// Конфигурация observer (за какими изменениями наблюдать)
const config =  {attributes: true, childList: true, subtree: true};
// Создаём экземпляр наблюдателя с указанной функцией колбэка
observer = new MutationObserver(closeDialog);
// Начинаем наблюдение за настроенными изменениями целевого элемента
observer.observe(fileElem, config);

Функция closeDialog не вызывалась никогда. Есть идеи, куда копнуть еще или что не так делаю?


Ответы (0 шт):