Update picker documentation
This commit is contained in:
@@ -1,19 +1,17 @@
|
|||||||
# Upload Platform
|
# Upload Platform
|
||||||
|
|
||||||
Переиспользуемый сервис загрузки файлов через ВМ-буфер. Выносит два слоя —
|
Переиспользуемый browser-only file-picker. Модуль выбирает отдельные файлы,
|
||||||
**выбор файлов** (фронт) и **закачку через ВМ** (фронт + бэк) — в отдельный
|
папки и ZIP, строит сворачиваемое дерево и возвращает исходные browser `File`
|
||||||
проект, который копируется в любой другой проект.
|
objects с полными путями. Файлы не отправляются на VM и не загружаются через
|
||||||
|
backend.
|
||||||
Паттерн: браузер → `PUT` на ВМ-буфер → Flask `POST /api/upload_refs` (egress pull) → сессия.
|
|
||||||
|
|
||||||
## Слои
|
## Слои
|
||||||
|
|
||||||
| Слой | Ответственность |
|
| Слой | Ответственность |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 0. Конфиг | `vmUploadUrl`, `allowedExt`, лимиты, ретраи |
|
| Конфиг | `allowedExt` |
|
||||||
| 1. Выбор файлов | таблица, дедуп, раскрытие ZIP, рекурсивный обход папки |
|
| Picker | таблица, дедупликация, ZIP, рекурсивный обход папки |
|
||||||
| 2. Закачка через ВМ | PUT на ВМ → pull в сессию |
|
| Интегрирующее приложение | получает leaf-файлы через `getFiles()` |
|
||||||
| 3. Логика приложения | здесь — стаб-заглушка (в каждом проекте своя) |
|
|
||||||
|
|
||||||
## Структура
|
## Структура
|
||||||
|
|
||||||
@@ -24,13 +22,10 @@ upload-platform/
|
|||||||
├── upload/ # ← переиспользуемый модуль (копируется в любой проект)
|
├── upload/ # ← переиспользуемый модуль (копируется в любой проект)
|
||||||
│ ├── README.md # инструкция интеграции
|
│ ├── README.md # инструкция интеграции
|
||||||
│ ├── config.example.json
|
│ ├── config.example.json
|
||||||
│ ├── frontend/ # слои 1+2 (vanilla JS, ES-модули)
|
│ ├── frontend/ # picker (vanilla JS, ES-модули)
|
||||||
│ │ ├── zip/
|
│ │ ├── zip/
|
||||||
│ │ ├── table/
|
│ │ ├── table/
|
||||||
│ │ └── upload/
|
│ └── backend/ # LEGACY: VM upload/session remnants
|
||||||
│ └── backend/ # слой 2 (Python)
|
|
||||||
│ ├── upload_refs/
|
|
||||||
│ └── session/
|
|
||||||
└── site/ # демо-обёртка (не переиспользуется)
|
└── site/ # демо-обёртка (не переиспользуется)
|
||||||
├── app.py
|
├── app.py
|
||||||
├── routes/
|
├── routes/
|
||||||
@@ -53,15 +48,22 @@ python site/app.py
|
|||||||
- Маршрут `/health` → `200` (иначе liveness-проба платформы убивает под).
|
- Маршрут `/health` → `200` (иначе liveness-проба платформы убивает под).
|
||||||
- Без `site/__init__.py` и factory pattern.
|
- Без `site/__init__.py` и factory pattern.
|
||||||
|
|
||||||
## Как интегрировать слои в другой проект
|
## Как интегрировать picker в другой проект
|
||||||
|
|
||||||
1. Скопировать папку `upload/` в свой проект.
|
1. Скопировать папку `upload/` в свой проект.
|
||||||
2. Задать свой конфиг (по образцу `upload/config.example.json`).
|
2. Задать конфиг по образцу `upload/config.example.json`.
|
||||||
3. Фронт: подключить ES-модули из `upload/frontend/` через `<script type="module">`,
|
3. Подключить локальный `fflate` до picker-модуля.
|
||||||
вызвать `initUploadTable(cfg)` и `uploadViaVM(...)`.
|
4. Вызвать `initUploadTable({ ...cfg, fileInputEl, folderInputEl, tableBodyEl, countEl })`.
|
||||||
4. Бэк: зарегистрировать `create_upload_refs_blueprint(cfg)`, импортировать `upload.backend.session`.
|
5. Получить выбранные leaf-файлы через `table.getFiles()`; каждый элемент содержит
|
||||||
5. Слой 3 (обработка файлов) — свой; сюда приходит список файлов сессии после закачки.
|
`path`, `name`, `size` и исходный `file`.
|
||||||
|
|
||||||
Подробнее — `PLAN.md`.
|
Разрешённые расширения по умолчанию: `.pdf`, `.doc`, `.docx`, `.txt`, `.md`.
|
||||||
|
ZIP-файлы используются как контейнеры и раскрываются в браузере; сам ZIP не
|
||||||
|
возвращается как leaf-файл. Ограничения размера и количества файлов не заданы.
|
||||||
|
|
||||||
|
## Legacy
|
||||||
|
|
||||||
|
`upload/backend/` и старые VM-upload упоминания сохранены только для истории и
|
||||||
|
совместимости с предыдущими этапами проекта. Текущая picker-only интеграция их
|
||||||
|
не импортирует и не требует Flask API для обработки файлов.
|
||||||
Переиспользуемая инструкция находится в `upload/README.md`.
|
Переиспользуемая инструкция находится в `upload/README.md`.
|
||||||
|
|||||||
+21
-6
@@ -1,13 +1,28 @@
|
|||||||
# Upload module
|
# Upload module
|
||||||
|
|
||||||
Скопируйте каталог `upload/` в проект и подключите:
|
Скопируйте каталог `upload/` в проект и подключите picker:
|
||||||
|
|
||||||
- `create_upload_refs_blueprint(config)` к Flask-приложению;
|
|
||||||
- `initUploadTable(config)` из `frontend/table/init_upload_table.js`;
|
- `initUploadTable(config)` из `frontend/table/init_upload_table.js`;
|
||||||
- `uploadViaVM(files, vmUploadUrl)` из `frontend/upload/upload_via_vm.js`.
|
- локальный `fflate` до загрузки picker-модуля.
|
||||||
|
|
||||||
В конфигурации задаются URL ВМ-буфера, допустимые расширения, лимиты и параметры
|
`config` должен содержать `allowedExt`, а также ссылки на DOM-элементы
|
||||||
повторных попыток pull. Backend-модуль хранит файлы сессии в памяти; обработка
|
`fileInputEl`, `folderInputEl`, `tableBodyEl` и `countEl`.
|
||||||
файлов остаётся ответственностью приложения, которое интегрирует этот модуль.
|
|
||||||
|
Публичный API таблицы:
|
||||||
|
|
||||||
|
- `pickFiles()` и `pickFolder()` — открыть системный выбор;
|
||||||
|
- `getFiles()` — получить leaf-файлы с `path`, `name`, `size` и `file`;
|
||||||
|
- `addFiles(files)` — добавить файлы программно;
|
||||||
|
- `remove(id)` и `clear()` — удалить узел или очистить дерево.
|
||||||
|
|
||||||
|
Picker поддерживает разрешённые документы, папки и вложенные ZIP, хранит
|
||||||
|
исходные browser `File` objects и выполняет дедупликацию по пути и размеру.
|
||||||
|
Загрузка на VM, backend sessions и upload API не используются.
|
||||||
|
|
||||||
|
## Legacy
|
||||||
|
|
||||||
|
Каталоги `backend/` и старые ссылки на `uploadViaVM`/VM-буфер относятся к
|
||||||
|
предыдущей архитектуре и сохранены как legacy-остатки. Для текущей picker-only
|
||||||
|
интеграции они не нужны.
|
||||||
|
|
||||||
Для ZIP перед ES-модулями загрузите локальный `fflate` из `site/static/vendor/`.
|
Для ZIP перед ES-модулями загрузите локальный `fflate` из `site/static/vendor/`.
|
||||||
Reference in New Issue
Block a user