4.6 KiB
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 (рабочий конфиг этого демо)
├── package.json # сборка browser bundle
├── build.mjs # esbuild: ESM + IIFE
├── dist/ # готовые bundle для встраивания
├── 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/
Локальный запуск
pip install -r requirements.txt
npm install
npm run build
python site/app.py
# → http://127.0.0.1:5000/
Для запуска уже собранного demo достаточно иметь зависимости Python и
содержимое dist/. npm run build требуется после изменения исходников
upload/frontend/.
Деплой на 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 в другой проект
- Скопировать
dist/file-picker.iife.jsилиdist/file-picker.esm.jsв свой проект. - Подключить IIFE через
<script>и вызватьFilePicker.initFilePicker, либо импортировать ESM-бандл. - Передать
mount,allowedExt, а при необходимостиlabels,layout,limitsиonChange. - Получить выбранные leaf-файлы через
picker.getFiles(); каждый элемент содержитpath,name,sizeи исходныйfile. - После удаления компонента вызвать
picker.destroy().
Исходники upload/frontend/ нужны только для разработки и пересборки bundle;
встроенная библиотека fflate уже включена в готовые bundle.
Разрешённые расширения демо: .pdf, .doc, .docx, .txt, .md.
ZIP-файлы используются как контейнеры и раскрываются в браузере; сам ZIP не
возвращается как leaf-файл. По умолчанию действуют ограничения: 1000 entries,
100 MiB суммарно, 50 MiB на entry и глубина 20.
Legacy
upload/backend/ и старые VM-upload упоминания сохранены только для истории и
совместимости с предыдущими этапами проекта. Текущая picker-only интеграция их
не импортирует и не требует Flask API для обработки файлов.
Переиспользуемая инструкция находится в upload/README.md.
Полный справочник функций, состояния, DOM-контрактов и ограничений находится в
docs/CODE-REFERENCE.md.
История решений и проверок находится в HISTORY/.