1.6 KiB
1.6 KiB
DrHider — Cyrillic filenames in ZIP fix (2026-07-07)
Проблема
Кириллические имена файлов в выходном ZIP отображаются кракозябрами (CP437 вместо UTF-8). Содержимое файлов — OK.
Причина (двойная)
- Мультипарт-парсер в
drhider_server.pyдекодирует HTTP-заголовки какlatin-1, но браузеры/curl шлют имена файлов в UTF-8. Результат — Mojibake. _build_zipвdrhider.py—zipfile.ZipFileв режиме записи кодирует имена в CP437, флаг UTF-8 не ставится.
Решение
Часть 1: мультипарт (drhider_server.py)
name = os.path.basename(m.group(1))
try:
name = name.encode('latin-1').decode('utf-8')
except (UnicodeDecodeError, UnicodeEncodeError):
pass
Часть 2: ZIP (drhider.py)
# Было:
zf.writestr(fname, content)
# Стало:
info = zipfile.ZipInfo(fname)
info.flag_bits |= 0x800
zf.writestr(info, content)
Затронутые файлы
- ВМ:
/home/naeel/contracts/drhider/drhider.py→_build_zip - ВМ:
/home/naeel/contracts/drhider/drhider_server.py→ multipart parser contracts-flask/deploy/drhider/drhider.pycontracts-flask/deploy/drhider/drhider_server.pycontracts-flask/site/services/drhider.py
Важно
metadata_encoding='utf-8'НЕ РАБОТАЕТ в Python 3.12.3 на запись- После правки
.py→rm -rf __pycache__перед перезапуском