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], '');