Страница 1 из 1

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

Добавлено: 2019.05.23, 20:50
myks1992@mail.ru
Всем привет! У меня функция

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

Yii::$app->response->sendFile($file)
отдает файл по названию экшена контроллера. Связано это с кодировкой файла. Он записан в русской (UTF-8) кодировке. Как мне получить файл с таким названием? Если меняю на латиницу, то всё ок!

Re: Send File в UTF 8

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

Re: Send File в UTF 8

Добавлено: 2019.05.24, 14:01
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, но хотелось бы чтобы работало как положено.

Re: Send File в UTF 8

Добавлено: 2019.05.24, 16:11
dmg
Передайте вторым параметром в sendFile имя файла

Re: Send File в UTF 8

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

Поэтому осмелюсь предположить, что названия исходных файлов у вас записаны не в кодировке utf-8.

Re: Send File в UTF 8

Добавлено: 2019.05.24, 21:08
myks1992@mail.ru
dmg писал(а): 2019.05.24, 16:11 Передайте вторым параметром в sendFile имя файла
Это пробовал

Re: Send File в UTF 8

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

Поэтому осмелюсь предположить, что названия исходных файлов у вас записаны не в кодировке utf-8.
Что тогда делаю не так? Не могу понять. Если не через yii, то название файла как нужно

Re: Send File в UTF 8

Добавлено: 2019.05.24, 22:21
dmg
Покажите код уже.

Re: Send File в UTF 8

Добавлено: 2019.05.24, 22:42
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

Re: Send File в UTF 8

Добавлено: 2019.05.26, 08:51
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); возвращает не то, что нужно в случае с кириллицей.

Re: Send File в UTF 8

Добавлено: 2019.05.26, 14:03
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); возвращает не то, что нужно в случае с кириллицей.
Странно. А у меня так не работает. Значит искать проблему надо не в фреймворке. Я смотрел все эти методы фреймворка отдачи файлов. Вижу, что простые. Но почему-то не могу разобраться что не так. С чем связано.

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

Добавлено: 2019.05.26, 23:11
myks1992@mail.ru
Не знаю что сделал, но удалось скачать файл в Кириллице. Что-то видимо было)) Намучался с этим. И помогло то что не заметил(