Files
contracts-flask/History/drhider-utf8-zip-2026-07-07.md
naeel e128b2614a
Deploy contracts-flask / validate (push) Successful in 0s
fix: drhider multipart UTF-8 filename decode (v1.8)
2026-07-07 15:50:43 +04:00

1.6 KiB

DrHider — Cyrillic filenames in ZIP fix (2026-07-07)

Проблема

Кириллические имена файлов в выходном ZIP отображаются кракозябрами (CP437 вместо UTF-8). Содержимое файлов — OK.

Причина (двойная)

  1. Мультипарт-парсер в drhider_server.py декодирует HTTP-заголовки как latin-1, но браузеры/curl шлют имена файлов в UTF-8. Результат — Mojibake.
  2. _build_zip в drhider.pyzipfile.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.py
  • contracts-flask/deploy/drhider/drhider_server.py
  • contracts-flask/site/services/drhider.py

Важно

  • metadata_encoding='utf-8' НЕ РАБОТАЕТ в Python 3.12.3 на запись
  • После правки .pyrm -rf __pycache__ перед перезапуском