# Upload Platform Переиспользуемый browser-only file-picker. Модуль выбирает отдельные файлы, папки и ZIP, строит сворачиваемое дерево и возвращает исходные browser `File` objects с полными путями. Файлы не отправляются на VM и не загружаются через backend. ## Слои | Слой | Ответственность | |---|---| | Конфиг | `allowedExt` | | 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/` в свой проект. 2. Задать конфиг по образцу `upload/config.example.json`. 3. Подключить локальный `fflate` до picker-модуля. 4. Вызвать `initUploadTable({ ...cfg, fileInputEl, folderInputEl, tableBodyEl, countEl })`. 5. Получить выбранные leaf-файлы через `table.getFiles()`; каждый элемент содержит `path`, `name`, `size` и исходный `file`. Разрешённые расширения по умолчанию: `.pdf`, `.doc`, `.docx`, `.txt`, `.md`. ZIP-файлы используются как контейнеры и раскрываются в браузере; сам ZIP не возвращается как leaf-файл. Ограничения размера и количества файлов не заданы. ## Legacy `upload/backend/` и старые VM-upload упоминания сохранены только для истории и совместимости с предыдущими этапами проекта. Текущая picker-only интеграция их не импортирует и не требует Flask API для обработки файлов. Переиспользуемая инструкция находится в `upload/README.md`. Полный справочник функций, состояния, DOM-контрактов и ограничений находится в [`docs/CODE-REFERENCE.md`](docs/CODE-REFERENCE.md).