Files
upload-platform/README.md
T

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).
  • Маршрут /health200 (иначе liveness-проба платформы убивает под).
  • Без site/__init__.py и factory pattern.

Как интегрировать picker в другой проект

  1. Скопировать dist/file-picker.iife.js или dist/file-picker.esm.js в свой проект.
  2. Подключить IIFE через <script> и вызвать FilePicker.initFilePicker, либо импортировать ESM-бандл.
  3. Передать mount, allowedExt, а при необходимости labels, layout, limits и onChange.
  4. Получить выбранные leaf-файлы через picker.getFiles(); каждый элемент содержит path, name, size и исходный file.
  5. После удаления компонента вызвать 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/.