Send File в Кирилице [РЕШЕНО!]

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Закрыто
myks1992@mail.ru
Сообщения: 147
Зарегистрирован: 2017.11.15, 23:54

Send File в Кирилице [РЕШЕНО!]

Сообщение myks1992@mail.ru »

Всем привет! У меня функция

Код: Выделить всё

Yii::$app->response->sendFile($file)
отдает файл по названию экшена контроллера. Связано это с кодировкой файла. Он записан в русской (UTF-8) кодировке. Как мне получить файл с таким названием? Если меняю на латиницу, то всё ок!
Последний раз редактировалось myks1992@mail.ru 2019.05.26, 23:10, всего редактировалось 2 раза.
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Send File в UTF 8

Сообщение Loveorigami »

Вы прям, прирожденный Лектор. Написано много, но ничего не понятно... :D
отдает файл по названию экшена контроллера. Связано это с кодировкой файла. Он записан в русской (UTF-8) кодировке.
Экшн?
Как мне получить файл с таким названием?
С каким? Как у экшена?
Если меняю на латиницу, то всё ок!
Вы пишите код по-русски?
myks1992@mail.ru
Сообщения: 147
Зарегистрирован: 2017.11.15, 23:54

Re: Send File в UTF 8

Сообщение myks1992@mail.ru »

Loveorigami писал(а): 2019.05.24, 10:07 Вы прям, прирожденный Лектор. Написано много, но ничего не понятно... :D
отдает файл по названию экшена контроллера. Связано это с кодировкой файла. Он записан в русской (UTF-8) кодировке.
Экшн?
Как мне получить файл с таким названием?
С каким? Как у экшена?
Если меняю на латиницу, то всё ок!
Вы пишите код по-русски?
Ахах) Бывает.

У меня аудио Файлы в mp3 формате. Пример названия: 2 - В лесу.mp3 Необходимо скачивать такие Файлы. Использую стандартное решение Yii. Вызывая sendFile сервер отдаёт файл, но при загрузке название меняется на название экшена контроллера: download-music.mp3 Связано это с русскими буквами в названии файла. Если файл переименовать в латиницу, то он загружает файл с названием файла, 2 - v lesu.mp3. Как мне загрузить файл стандартным решением yii и чтобы Файлы оставались с русским названием?

Сделал пока реализацию без yii, но хотелось бы чтобы работало как положено.
dmg
Сообщения: 685
Зарегистрирован: 2012.10.15, 03:09

Re: Send File в UTF 8

Сообщение dmg »

Передайте вторым параметром в sendFile имя файла
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

Re: Send File в UTF 8

Сообщение proctoleha »

У вас путаница в голове. В web нет РУССКОЙ кодировки UTF-8. Впрочем как и нерусской. Это раньше было актуально, навскидку приходят KOI-8, и CP-1251. А сейчас такого нет.

Поэтому осмелюсь предположить, что названия исходных файлов у вас записаны не в кодировке utf-8.
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
myks1992@mail.ru
Сообщения: 147
Зарегистрирован: 2017.11.15, 23:54

Re: Send File в UTF 8

Сообщение myks1992@mail.ru »

dmg писал(а): 2019.05.24, 16:11 Передайте вторым параметром в sendFile имя файла
Это пробовал
myks1992@mail.ru
Сообщения: 147
Зарегистрирован: 2017.11.15, 23:54

Re: Send File в UTF 8

Сообщение myks1992@mail.ru »

proctoleha писал(а): 2019.05.24, 20:07 У вас путаница в голове. В web нет РУССКОЙ кодировки UTF-8. Впрочем как и нерусской. Это раньше было актуально, навскидку приходят KOI-8, и CP-1251. А сейчас такого нет.

Поэтому осмелюсь предположить, что названия исходных файлов у вас записаны не в кодировке utf-8.
Что тогда делаю не так? Не могу понять. Если не через yii, то название файла как нужно
dmg
Сообщения: 685
Зарегистрирован: 2012.10.15, 03:09

Re: Send File в UTF 8

Сообщение dmg »

Покажите код уже.
myks1992@mail.ru
Сообщения: 147
Зарегистрирован: 2017.11.15, 23:54

Re: Send File в UTF 8

Сообщение myks1992@mail.ru »

dmg писал(а): 2019.05.24, 22:21 Покажите код уже.

Код: Выделить всё

public function actionDownloadMusicRequest($id)
    {
        $request = $this->findModel($id);

        if (!$request->isMusicExists()) {
            throw new NotFoundHttpException('The music does not exists.');
        }
        $music = $request->getUploader()->getPath() . DIRECTORY_SEPARATOR . $request->music;
        return Yii::$app->response->sendFile($music, TranslatorHelper::translate($request->music));

    }
Сейчас сделал TranslatorHelper который меняет русские буквы на латиницу. Но если убрать, то выдаст файл "download-music-request.mp3" вместо 2 - 17 - Oriental show_Дети_Соло_Открытый класс.mp3
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

Re: Send File в UTF 8

Сообщение proctoleha »

Вот только что попробовал, ради интереса:

Код: Выделить всё

        $filePath = Yii::getAlias('@app/web/documents/444/');
        Yii::$app->response->sendFile($filePath . 'русское имя.pdf');
Все нормально.

Ок, смотрим исходники

Код: Выделить всё

    public function sendFile($filePath, $attachmentName = null, $options = [])
    {
        if (!isset($options['mimeType'])) {
            $options['mimeType'] = FileHelper::getMimeTypeByExtension($filePath);
        }
        if ($attachmentName === null) {
            $attachmentName = basename($filePath);
        }
        $handle = fopen($filePath, 'rb');
        $this->sendStreamAsFile($handle, $attachmentName, $options);

        return $this;
    }
Метод простой как две копейки, и для локализации проблемы вам достаточно исследовать почему basename($filePath); возвращает не то, что нужно в случае с кириллицей.
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
myks1992@mail.ru
Сообщения: 147
Зарегистрирован: 2017.11.15, 23:54

Re: Send File в UTF 8

Сообщение myks1992@mail.ru »

proctoleha писал(а): 2019.05.26, 08:51 Вот только что попробовал, ради интереса:

Код: Выделить всё

        $filePath = Yii::getAlias('@app/web/documents/444/');
        Yii::$app->response->sendFile($filePath . 'русское имя.pdf');
Все нормально.

Ок, смотрим исходники

Код: Выделить всё

    public function sendFile($filePath, $attachmentName = null, $options = [])
    {
        if (!isset($options['mimeType'])) {
            $options['mimeType'] = FileHelper::getMimeTypeByExtension($filePath);
        }
        if ($attachmentName === null) {
            $attachmentName = basename($filePath);
        }
        $handle = fopen($filePath, 'rb');
        $this->sendStreamAsFile($handle, $attachmentName, $options);

        return $this;
    }
Метод простой как две копейки, и для локализации проблемы вам достаточно исследовать почему basename($filePath); возвращает не то, что нужно в случае с кириллицей.
Странно. А у меня так не работает. Значит искать проблему надо не в фреймворке. Я смотрел все эти методы фреймворка отдачи файлов. Вижу, что простые. Но почему-то не могу разобраться что не так. С чем связано.
myks1992@mail.ru
Сообщения: 147
Зарегистрирован: 2017.11.15, 23:54

Re: Send File в Кирилице [РЕШЕНО!]

Сообщение myks1992@mail.ru »

Не знаю что сделал, но удалось скачать файл в Кириллице. Что-то видимо было)) Намучался с этим. И помогло то что не заметил(
Закрыто