# Upload Platform Переиспользуемый browser-only file-picker. Модуль выбирает отдельные файлы, папки и ZIP, строит сворачиваемое дерево и возвращает исходные browser `File` objects с полными путями. Файлы не отправляются на VM и не загружаются через backend. ## Слои | Слой | Ответственность | |---|---| | Конфиг | `allowedExt`, `labels`, `layout`, `limits` | | Picker | таблица, дедупликация, ZIP, рекурсивный обход папки | | Интегрирующее приложение | получает leaf-файлы через `getFiles()` | ## Структура ``` upload-platform/ ├── requirements.txt ├── config.json # слой 0 (рабочий конфиг этого демо) ├── upload/ # ← переиспользуемый модуль (копируется в любой проект) │ ├── README.md # инструкция интеграции │ ├── config.example.json │ ├── frontend/ # picker (vanilla JS, ES-модули) │ │ ├── zip/ │ │ ├── table/ │ └── backend/ # LEGACY: VM upload/session remnants └── site/ # демо-обёртка (не переиспользуется) ├── app.py ├── routes/ ├── templates/ └── static/ ``` ## Локальный запуск ```bash pip install -r requirements.txt python site/app.py # → http://127.0.0.1:5000/ ``` ## Деплой на Nubes - Точка входа: `site/app.py` (платформа запускает `python site/app.py`). - `app.run(host="0.0.0.0", port=5000, debug=False)`. - Маршрут `/health` → `200` (иначе liveness-проба платформы убивает под). - Без `site/__init__.py` и factory pattern. ## Как интегрировать picker в другой проект 1. Скопировать `upload/frontend/` и один из собранных файлов `dist/` в свой проект. 2. Подключить `file-picker.iife.js` через `