@Al3xanderG
Вспоминаю как это быть web разработчиком...

Как изменить header content-type при отдаче файла методом Storage::get($file)?

Делаю отдачу документов средствами php, указываю Content-Type. А при клике на ссылку всегда определяется тип как text/html
6028728.pngи если открыть файл в браузере соответственно он получается кривым. Если сохранять, то все ОК. Почему явное указание content-type не работает?
public function getDocument($file)
    {
        
        // получаем всю инфу о файле:
        $saveFile=FileMeeting::find($file);
        // получаем путь к файлу:
        $dir='meeting/'.$saveFile->meeting_id.'/'.$saveFile->filename;

        // получаем его размер
        $size = Storage::size($dir);

        // получаем расширение
        $ext = substr(strrchr($saveFile->filename, '.'), 1);
        $mime = MimeType::detectByFileExtension($ext);

        // приводим имя файла к божескому виду из титла
        $nameToGet = preg_replace('/[^\p{L}0-9]/u', '', $saveFile->title);

        // сбрасываем буфер вывода PHP, чтобы избежать переполнения памяти выделенной под скрипт
        // если этого не сделать файл будет читаться в память полностью!
        if (ob_get_level()) {
            ob_end_clean();
        }
        // заставляем браузер показать окно сохранения файла
        header('Content-Description: File Transfer');
        //header("Content-type: application/pdf");
        header('Content-type: '.$mime);
        header('Content-Disposition: attachment; filename=doc.pdf');
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . $size);

        // читаем файл и отправляем его пользователю
        return Storage::get($dir);
        exit;

    }


Решение и правда простое:
return response()->download($dir,$nameToGet);
  • Вопрос задан
  • 2058 просмотров
Решения вопроса 1
Denormalization
@Denormalization
Потому что Laravel оборачивает ответ в свой Response, в котором указан text/html.

Не нужно вручную слать header, нужно возвращать Response объект, в котором указывать заголовки, тогда всё будет работать.

Можно было самому открыть документацию и найти laravel.com/docs/5.1/responses#file-downloads
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
sanchezzzhak
@sanchezzzhak
Ля ля ля...
Зачем, отдавать файл через пых?
а) пока файл не отдастся пользователю у вас будет работать скрипт .

Лучше это возложить на сервер через X-Accel-Redirect
valera.ws/2012.03.06~accel-redirect-apache-dokachka
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы