У меня есть HTML-форма с элементом ввода файла. При отправке формы выполняется функция JS, которая проверяет, является ли загруженный файл PDF-файлом и его размер меньше 10 МБ. Все это работает правильно, и в консоли регистрируется правильный размер файла.
Затем функция JS отправляет файл на сервер Python посредством запроса HTTP POST. Однако отправленный файл всегда представляет собой пустой объект/словарь. Когда я console.log(file); перед отправкой, все данные файла регистрируются, но когда я смотрю на вкладку «Сеть» в инспекторе, это просто пустой объект/словарь:

Однако, когда я меняю свою HTML-форму так, чтобы она отправляла данные непосредственно в CGI-скрипт Python без предварительного вызова функции JS, она работает отлично.
Вот мой HTML-код:
тест Проверка загрузки файла контракт: Аннулеер функция отмены() { константный хост = window.location.host; const redirectUrl = `http://${host}`; window.location.replace(redirectUrl); } Код JavaScript:
асинхронная функция addFile() { const formData = новые FormData(document.forms["DataForm"]); // получаем загруженные файлы // Функция для проверки и добавления файла в formData функция handleFileUpload(fileInputId) { console.log("загрузка файла..."); const fileInput = document.getElementById(fileInputId); константный файл = fileInput.files[0]; // Проверяем, выбран ли файл // Убедитесь, что файл является PDF-файлом if (file.type === "application/pdf") { console.log(`filesize = ${file.size}`); // 10 МБ в байтах formData.append(fileInputId, fileInput.files[0]); } вернуть истину; } // Обрабатываем загрузку каждого файла отдельно if (!handleFileUpload("file_contract")) { console.log("Отправка формы запрещена"); вернуть ложь; // Запретить отправку формы } константные данные = { ответы: Object.fromEntries(formData), }; console.log(data["ответы"]["file_contract"]); пытаться { const ответ = ожидание выборки("../../cgi-bin/addRecord.py", { метод: «ПОСТ», заголовки: { "Тип контента": "application/json; кодировка = UTF-8", }, тело: JSON.stringify(данные), }); const responseData = ждут ответа.json(); if (responseData.hasOwnProperty("статус")) { if (responseData["статус"] === "не удалось") { // сессия недействительна/истек срок действия alert("Войти в систему. Войти в систему."); } else if (responseData.status === "успех") { константный хост = window.location.host; const redirectUrl = `http://${host}`; console.log("перенаправление... (закомментировано)"); // window.location.replace(redirectUrl); } еще { тревога( «Fout bij het opslaan. Исследуй контактер Сандру». ); } } } поймать (ошибка) { console.error(ошибка); alert("Если нет ошибок. Проверьте информацию контактера Сандры."); } } CGI Python:
#!/usr/bin/env python3 импортировать CGI импортировать хеш-библиотеку импортировать JSON импортировать ОС импортировать систему журнал импорта # Получить абсолютный путь к текущему скрипту имя_каталога = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) if os.path.exists(f'{dirname + "/log.log"}'): # Если он существует, откройте его в режиме записи, чтобы очистить его содержимое с open(f'{dirname + "/log.log"}', 'w'): проходить logging.basicConfig(filename=f'{имя_каталога + "/log.log"}', level=logging.DEBUG) Защиту генерировать_ответ (статус, данные = Нет): ответ = {"статус": статус} если данные: ответ["данные"] = данные print("Тип контента: приложение/json") Распечатать() печать(json.dumps(ответ)) защита вычисление_file_hash (file_data): # Создаём хэш-объект MD5 md5_hash = hashlib.md5() # Чтение данных файла по частям для эффективной обработки больших файлов для чанка в iter(lambda: file_data.read(4096), b''): md5_hash.update(кусок) # Возвращаем шестнадцатеричное представление хеша MD5 вернуть md5_hash.hexdigest() защита основного(): # прочитать данные формы из HTTP POST-запроса данные = sys.stdin.read(int(os.environ.get('CONTENT_LENGTH', 0))) post_data = json.loads(данные) ответы = post_data["ответы"] logging.debug(str(ответы)) если в ответах "file_contract": контракт_файл = ответы['file_contract'] имя_файла_контракта = имя_файла_контракта.имя_файла хеш_файла_контракта = хэш_файла_расчета(файл_контракта.файл) # сохраняем данные файла в werkmap # Сохраняем PDF-файл в папку Contract_filename_path = os.path.join(имя_каталога, "документ", Contract_file_hash) с open(contract_filename_path, 'wb') как Contract_file_handle: Contract_file_handle.write(contract_file.file.read()) генерировать_ответ («успех») если __name__ == "__main__": основной()