fix: harden browser file picker and remove legacy

This commit is contained in:
“Naeel”
2026-09-05 20:50:36 +03:00
parent f6b2f6d1b3
commit 017bd8c354
20 changed files with 499 additions and 216 deletions
+6 -30
View File
@@ -1,7 +1,7 @@
# Справочник кода Upload Platform
Документ описывает актуальную picker-only реализацию. VM upload, backend sessions
и API загрузки являются legacy и в текущем коде не используются.
и API загрузки относятся к отменённой архитектуре и в текущем коде отсутствуют.
## Архитектура
@@ -71,7 +71,7 @@ Flask отдаёт страницу и готовый bundle. Все выбра
| Функция | Вход | Выход | Побочные эффекты |
|---|---|---|---|
| `rebaseTree(root, prefix)` | Дерево и префикс папки | То же дерево | Рекурсивно меняет `path`; для leaf создаёт File с новым именем. |
| `rebaseTree(root, prefix)` | Дерево и префикс папки | То же дерево | Рекурсивно меняет `path`; для leaf сохраняет базовое имя `File.name`. |
Модуль является единственной реализацией rebasing для ZIP внутри выбранной папки
и для nested ZIP.
@@ -107,26 +107,6 @@ callback задан. `finally` обязательно освобождает `bu
`render` считает все leaf-файлы, включая свернутые группы. `renderNode` показывает
дочерние строки только при `expanded === true`.
### `init_upload_table.js` (legacy)
| Функция | Вход | Выход | Назначение |
|---|---|---|---|
| `removeFileMeta(state, node)` | state и удаляемое поддерево | `void` | Рекурсивно удаляет dedup-ключи. Внутренняя функция. |
| `removeNode(state, id)` | state и id | `void` | Удаляет узел из родительского массива. Внутренняя функция. |
| `initUploadTable(cfg)` | `allowedExt` и четыре DOM-элемента | API-объект | Создаёт state, события, render и публичные операции. |
Публичный API legacy-совместимости:
| Метод | Вход | Результат |
|---|---|---|
| `pickFiles()` | нет | Открывает обычный file input. |
| `pickFolder()` | нет | Открывает folder input. |
| `addFiles(files)` | FileList/Array | Добавляет файлы с фильтрацией и ZIP-разбором. |
| `getFiles()` | нет | `{path, name, size, file}[]` только для leaf. |
| `remove(id)` | id узла | Удаляет узел и его dedup-ключи. |
| `render()` | нет | Перерисовывает текущий state. |
| `clear()` | нет | Очищает дерево и dedup Set. |
## `upload/frontend/zip`
### `list_zip_files.js`
@@ -134,7 +114,7 @@ callback задан. `finally` обязательно освобождает `bu
| Функция | Вход | Выход | Назначение |
|---|---|---|---|
| `extensionAllowed(name, allowedExt)` | Имя и расширения | boolean | Проверяет расширение. Внутренняя. |
| `makeFile(data, name)` | Байты и путь | `File` | Создаёт browser File. Внутренняя. |
| `makeFile(data, name)` | Байты и путь | `File` | Создаёт browser File с базовым именем. Внутренняя. |
| `safeEntryParts(entryName)` | Сырой ZIP-путь | сегменты или null | Отбрасывает traversal и опасные пути. Внутренняя. |
| `node(kind, name, path, children, file)` | Метаданные узла | node | Создаёт узел. Внутренняя. |
| `addPath(root, parts, fileNode)` | Дерево, сегменты, узел | `void` | Создаёт папки и вставляет узел. Внутренняя. |
@@ -168,7 +148,7 @@ vendor script не требуется.
| `VERSION` | константа | Версия страницы |
| `index()` / `/` | HTTP GET | HTML с version и config |
| `health()` / `/health` | HTTP GET | `ok`, HTTP 200 |
| `upload_frontend(filename)` | HTTP GET и относительный путь | Legacy-файл из `upload/frontend` |
| `upload_frontend(filename)` | HTTP GET и относительный путь | Совместимый маршрут для исходных frontend-модулей |
| `file_picker_dist(filename)` | HTTP GET и имя bundle | Bundle из `dist` |
### `site/templates/index.html`
@@ -176,9 +156,5 @@ vendor script не требуется.
Шаблон создаёт mount, подключает IIFE bundle с query-параметром версии для
сброса browser cache и вызывает `FilePicker.initFilePicker`.
## Legacy
`upload/frontend/table/set_status.js` не импортируется актуальной страницей и
сохранён как legacy-заготовка. Vendor `site/static/vendor/fflate.min.js` не
документируется построчно: это внешняя библиотека, используемая как готовый
runtime dependency.
Vendor `site/static/vendor/fflate.min.js` не документируется построчно: это
внешняя библиотека, используемая как готовый runtime dependency.