88 lines
4.6 KiB
Markdown
88 lines
4.6 KiB
Markdown
# 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/
|
|
```
|
|
|
|
## Локальный запуск
|
|
|
|
```bash
|
|
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 в другой проект
|
|
|
|
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`](docs/CODE-REFERENCE.md).
|
|
|
|
История решений и проверок находится в [`HISTORY/`](HISTORY/).
|