Отправка загруженного файла из JS в Python CGI всегда приводит к пустому словарю.Javascript

Форум по Javascript
Ответить Пред. темаСлед. тема
Гость
 Отправка загруженного файла из JS в Python CGI всегда приводит к пустому словарю.

Сообщение Гость »


У меня есть 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__": основной()
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Javascript»