From 82b597e1c2eb300e889978cbf9a40ee071176332 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Sun, 23 Aug 2026 07:05:52 +0300 Subject: [PATCH] =?UTF-8?q?drhider:=20=D1=82=D0=B5=D1=81=D1=82-=D1=80?= =?UTF-8?q?=D0=B5=D0=B6=D0=B8=D0=BC=20'=D1=82=D0=BE=D0=BB=D1=8C=D0=BA?= =?UTF-8?q?=D0=BE=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B0'=20(?= =?UTF-8?q?=3Fupload-only=3D1)=20=E2=80=94=20=D1=80=D0=B0=D0=BD=D0=BD?= =?UTF-8?q?=D0=B8=D0=B9=20=D0=B2=D1=8B=D1=85=D0=BE=D0=B4=20=D0=B4=D0=BE=20?= =?UTF-8?q?=D0=A4=D0=B0=D0=B7=D1=8B=202=20(=D0=B1=D0=B5=D0=B7=20=D0=BE?= =?UTF-8?q?=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B8)=20+=20debug-e?= =?UTF-8?q?ndpoint=20/api/session=5Ffiles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- site/routes/api_bp.py | 12 ++++++++++++ site/templates/index.html | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/site/routes/api_bp.py b/site/routes/api_bp.py index 10dc908..0e7b28b 100644 --- a/site/routes/api_bp.py +++ b/site/routes/api_bp.py @@ -108,6 +108,18 @@ def upload_refs(): return jsonify({"ok": True, "session": sid, "count": file_count(sid)}) +@api_bp.route("/session_files/", methods=["GET"]) +def session_files(sid): + """Отладка: список файлов сессии с размерами (для теста загрузки).""" + files = get_files(sid) + if files is None: + return jsonify({"ok": False, "error": "Session not found"}), 404 + return jsonify({ + "ok": True, "count": len(files), + "files": [{"name": n, "size": len(b)} for n, b in files], + }) + + @api_bp.route("/process_stream/", methods=["GET"]) def process_stream(sid): """SSE: process all session files, streaming per-file progress. diff --git a/site/templates/index.html b/site/templates/index.html index 2c5a4bd..b0fd0be 100644 --- a/site/templates/index.html +++ b/site/templates/index.html @@ -199,6 +199,8 @@ let overNames = new Set(); // имена файлов сверх лимита ( const MAX_FILE_BYTES = 100 * 1024 * 1024; // 100 МБ на файл const MAX_SESSION_BYTES = 1024 * 1024 * 1024; // 1 ГБ суммарно const VM_UPLOAD_URL = 'https://contracts.kube5s.ru/drhider-upload/'; // ВМ-буфер: PUT больших файлов (шлюз кластера их рвёт) +// Тест-режим: открыть страницу с ?upload-only=1 → только загрузка, без обработки +const TEST_UPLOAD_ONLY = new URLSearchParams(location.search).get('upload-only') === '1'; let currentSid = ''; let activeES = null; // активный EventSource let activeXHR = null; // активный XHR @@ -438,6 +440,7 @@ async function uploadFiles() { // Фаза 1: загрузка на ВМ-буфер (PUT напрямую на nginx ВМ, минуя шлюз кластера) const token = crypto.randomUUID(); const refs = []; // {name, size, url} — для POST /api/upload_refs + let uploadedCount = 0; // сколько файлов реально легло в сессию (для тест-режима) for (let k = 0; k < total; k++) { const f = toSend[k]; const i = sendIdx[k]; // индекс в sf для вывода прогресса @@ -494,6 +497,7 @@ async function uploadFiles() { const data = await resp.json(); if (!data.ok) throw new Error(data.error || 'HTTP ' + resp.status); currentSid = data.session; + uploadedCount = data.count || refs.length; } catch (err) { st.className = 'status error'; st.textContent = 'Ошибка передачи ссылок: ' + err.message; @@ -501,6 +505,14 @@ async function uploadFiles() { return; } + // Тест-режим (?upload-only=1): только загрузка, без обработки + if (TEST_UPLOAD_ONLY) { + st.className = 'status done'; + st.textContent = '✅ Загружено ' + uploadedCount + ' файлов (тест: обработка пропущена). Сессия: ' + currentSid; + ub.disabled = false; + return; + } + // Фаза 2: обработка (SSE — прогресс по каждому файлу) // Сброс загрузочных статусов — теперь этап обработки (только отправленные) for (let k = 0; k < total; k++) ss(sendIdx[k], '');