Email backup. Выбираем архиватор почтовых сообщений.

#bug

Open Archiver не дает сохранить файлы с кириллицей

В @телеграмме один из самохостят @hageshii666 выявил и починил баг

Как @hageshii666 используя DeepSeek нашел и устранил проблему

Вот линк на то что мне дипсик выплюнул
DeepSeek

Вот тут надо редактировать код
/opt/openarchiver/packages/backend/dist/api/controllers/

Да, поменял в storage.controller.js и всё заработало как надо

Вот это:

            const fileName = path.basename(safePath);
            res.setHeader('Content-Disposition', `attachment; filename="${fileName}"`);
            fileStream.pipe(res);

Заменил на это:

            const fileName = path.basename(safePath);
            // Кодируем имя файла для безопасного использования в HTTP-заголовках
            const encodedFileName = encodeURIComponent(fileName)
                .replace(/['()]/g, escape)
                .replace(/\*/g, '%2A');
            // Устанавливаем два варианта заголовка для совместимости
            const safeFileName = fileName.replace(/[^\x20-\x7E]/g, '_'); // Только ASCII символы
            res.setHeader(
                'Content-Disposition', 
                `attachment; filename="${safeFileName}"; filename*=UTF-8''${encodedFileName}`
            );
            fileStream.pipe(res);

Я же(еще не видя его ответа) - пошел изучать github open-archiver’a и нашел:

  1. Ишью OpenArchiver/issues/182
  2. А внутри ссылку на OpenArchiver/commit
Как решить проблему по примеру issue\commit'а

Где в файле

/opt/openarchiver/packages/backend/dist/api/controllers/storage.controller.js

строчку

res.setHeader('Content-Disposition', `attachment; filename="${fileName}"`);

заменяют на

const encodedFileName = encodeURIComponent(fileName);
res.setHeader('Content-Disposition', `attachment; filename*=UTF-8''${encodedFileName}`);

Что позволяет исправить проблему с кодировкой в названии скаиваемого файла.

Коммит пока в билд текущей сборки не попал, посему правим ручками и живем счастливо.

Еще раз спасибо @hageshii666 за наводку на баг и починку!

1 лайк