Files
drhider/History/ux-frontend/2026-08-19-zip-expand-frontend.md
T

53 lines
3.1 KiB
Markdown

# v0.0.33 — раскрытие ZIP в таблицу (фронтенд) — 2026-08-19
**Дата:** 2026-08-19
**Версия:** 0.0.32 → 0.0.33
**Файл:** `site/templates/index.html` (фронтенд), `site/app.py` (версия)
---
## Суть
Раньше выбранный `.zip` попадал в таблицу одной строкой и не раскрывался.
Теперь при выборе файлов ZIP **распаковывается на клиенте**, файлы из архива
попадают в таблицу **по отдельности** (полный относительный путь).
## Что добавлено (`index.html`, в тот же `<script>`)
1. **Нативный распаковщик ZIP** без внешних библиотек:
- `DecompressionStream('deflate-raw')` — поддержка сжатых (DEFLATE) архивов
(WhatsApp/1С архивы сжаты; старый STORE-only `unzip` из v5 не подходил).
- `parseZip()` — разбор EOCD → Central Directory → local headers.
- `dosToMs()` — DOS date/time (4 байта) → timestamp (мс).
- `decodeZipName()` — имя: UTF-8 (если флаг 0x800) иначе CP437→CP866
(кириллица из 1С, зеркалит серверный `_decode_name`).
2. **Рекурсия** `listZipFiles()`:
- директории (`name` оканчивается на `/`) пропускаются;
- вложенный `.zip` распаковывается рекурсивно;
- имя сохраняется **полным путём** (`dir1/sub/file.pdf`).
3. **Дедуп + суффикс** `addFileWithDedup()`:
- структура `fileMeta` (Map: имя → `{size, mtime}`);
- имя есть + тот же размер И та же дата → точный дубль → **пропустить**;
- имя есть + разный размер ИЛИ дата → **суффикс** `name_2.ext`, `name_3.ext`…;
- дата: для обычных файлов `File.lastModified` (мс), для извлечённых из ZIP —
DOS date/time → мс.
4. `fi.addEventListener('change')` переписан в `async`:
- `.zip` → `listZipFiles` → каждый файл через `addFileWithDedup`;
- при ошибке распаковки (неподдерживаемый метод/не-ZIP) — zip добавляется как есть.
## Проверка
- JS-синтаксис: `node --check` — OK.
- Рекурсия вложенного ZIP (`nested.zip` → `sub/a.txt`) — извлечён, проверено в Node.
- Дедуп/суффикс: `dup.txt` (3) → `dup_2.txt` (5) → `dup_3.txt` (2); точный дубль пропущен.
- Backend не менялся (кроме версии в `app.py`).
## Открытый вопрос
`DecompressionStream` требует современных браузеров (Chrome 103+, Safari 16.4+,
Firefox 113+). AES-шифрованные ZIP (метод 99) не поддерживаются — при этом архив
добавляется в таблицу как есть (fallback).