3.1 KiB
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>)
-
Нативный распаковщик ZIP без внешних библиотек:
DecompressionStream('deflate-raw')— поддержка сжатых (DEFLATE) архивов (WhatsApp/1С архивы сжаты; старый STORE-onlyunzipиз v5 не подходил).parseZip()— разбор EOCD → Central Directory → local headers.dosToMs()— DOS date/time (4 байта) → timestamp (мс).decodeZipName()— имя: UTF-8 (если флаг 0x800) иначе CP437→CP866 (кириллица из 1С, зеркалит серверный_decode_name).
-
Рекурсия
listZipFiles():- директории (
nameоканчивается на/) пропускаются; - вложенный
.zipраспаковывается рекурсивно; - имя сохраняется полным путём (
dir1/sub/file.pdf).
- директории (
-
Дедуп + суффикс
addFileWithDedup():- структура
fileMeta(Map: имя →{size, mtime}); - имя есть + тот же размер И та же дата → точный дубль → пропустить;
- имя есть + разный размер ИЛИ дата → суффикс
name_2.ext,name_3.ext…; - дата: для обычных файлов
File.lastModified(мс), для извлечённых из ZIP — DOS date/time → мс.
- структура
-
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).