v0.0.33: раскрытие ZIP в таблицу (фронт) — нативный unzip, рекурсия, дедуп по размер+дате
Deploy drhider / validate (push) Canceled after 0s
Deploy drhider / validate (push) Canceled after 0s
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
# 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).
|
||||
Reference in New Issue
Block a user