Files
drhider/History/2026-08-19-folder-select-recursive.md
T

3.3 KiB
Raw Blame History

v0.0.47 — Выбор целой папки (рекурсивно, как раскрытие ZIP) — 2026-08-19

Проблема

Нативный <input type="file"> (site/templates/index.html:133) не умеет выбирать папку целиком: клик по папке просто «входит» внутрь. Нужно выбирать целую папку и рекурсивно забирать все файлы — как при раскрытии архива.

Решение

  • Второй <input type="file" id="folderInput" webkitdirectory multiple> + кнопка «📁 Выбрать папку» (вызов folderInput.click()). webkitdirectory взаимоисключающ с обычным выбором файлов на одном input — поэтому отдельный input, а не переключатель.
  • Браузер сам отдаёт ВСЕ файлы папки рекурсивно (включая подпапки) с полем file.webkitRelativePath. Имя добавляемого файла = webkitRelativePath (структура папок сохраняется до итогового ZIP, как у архива сохраняется внутренний e.name).
  • Обработка — та же логика, что у раскрытия ZIP (listZipFiles):
    • .zip → рекурсивное раскрытие (вложенные zip тоже);
    • документы .pdf .doc .docx .txt .md → в таблицу;
    • прочее (картинки и т.п.) → пропускается.
  • Сортировка входящих файлов по webkitRelativePath — детерминированный порядок.

Файлы

  • site/templates/index.html
    • CSS: .folder-btn (полная ширина), #folderInput { display:none }
    • HTML: скрытый #folderInput + кнопка в .file-input-wrap
    • JS: const folderInput, обработчик change (рекурсия+фильтр+имена с путями)
    • resetAll() и load — сброс folderInput.value
  • site/app.py — VERSION 0.0.46 → 0.0.47

Бэкенд — не менялся

  • extract_text (drhider/extractor.py:204) берёт расширение через os.path.splitext — пути в имени не мешают.
  • build_zip (drhider/builder.py) пишет ZipInfo с путями как есть; _resolve_name дедуплицирует по полному имени — одноимённые файлы в разных подпапках не сталкиваются.
  • Аплоад идёт из массива sf (uploadFiles), а не из fi.files — файлы из папки уходят на бэк обычным путём.

Проверка

  1. «Выбрать папку» → папка с подпапками, вложенными .zip и картинками → в таблице только документы, рекурсивно; .zip раскрыт; картинки пропущены; имена с путями.
  2. Обфускация → скачать ZIP → вложенность папок сохранена, всё обфусцировано.
  3. Регрессия: обычный «Выбрать файлы» работает как раньше.