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

3.1 KiB

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).