Задать вопрос
@cajka-d

Почему браузер вместо того, чтобы скачать файл PDF, патается его отобразить?

Использую библиотеку snappy для генерации PDF. Били отеку подключила для Laravel. Сама генерации я работает нормально. Но когда в контроллере отдаю файл на скачивание, в браузере не происходит скачивание, вместо этого, он пытается вывести содержимое.

Код контроллера:
<?php
namespace App\Http\Controllers;

use App\Services\AmoCredentials;
use Carbon\Carbon;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\Facades\App;

class PdfGeneratorController extends Controller
{
    public function generate(int $leadId)
    {
        $lead = AmoCredentials::getApiClient()->leads()->getOne($leadId);
        $cf = $lead->getCustomFieldsValues();
        $fields = [];
        $dates = [820727, 671325];

        if ($cf) {
            $fields = collect($cf->toArray())
                ->mapWithKeys(function (array $a, $key) use ($dates) {
                    $value = implode(', ', Arr::pluck(Arr::get($a, 'values'), 'value'));
                    if(in_array(Arr::get($a, 'field_id'), $dates)) {
                        $value = Carbon::make($value);
                    }
                    return [
                        Arr::get($a, 'field_id') =>$value
                    ];
                });
        }

       // $html = Blade::render('kp', ['id' => $lead->getId(), 'price' => $lead->getPrice(), 'fields' => $fields]);
        
        $filename = 'test.pdf';
        $kp = Blade::render('kp-test');

        $pdf = App::make('snappy.pdf.wrapper');

        $pdf = \PDF::loadView('kp-test');

        $pdf->setOption('encoding', 'UTF-8');
        $pdf->setOption('page-width', '200');
        $pdf->setOption('page-height', '650');
        $pdf->setOption('user-style-sheet', "body { font-size: '16px'; }");

        //return $pdf->generateFromHtml($kp, $filename);

        return $pdf->download($filename);
    }
}

Получаю в браузере типа такого:
65d1b87c39816201567328.png
Если, например вместо
return $pdf->download($filename);
использовать
return $pdf->generateFromHtml($kp, $filename);
то файл PDF генерируется и сохраняется в папку public,если открыть в браузере, то все нормально.
Но если использовать методы download, output, inline, stream вывод в браузере получаю, как скриншоте выше.

Может, кто знает, в чем проблема?
  • Вопрос задан
  • 206 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Смотрите, с какими заголовками возвращается ответ.
Для скачивания файла должны быть установлены
Content-Disposition: attachment, filename="filename.pdf"
и либо Content-Type: application/pdf, либо Content-Type: application/octet-stream.
У вас, скорее всего, возвращается Content-Type: text/html.
Ответ написан
ThunderCat
@ThunderCat
{PHP, MySql, HTML, JS, CSS} developer
cajka-d, 1)
Вывода перед заголовками тоже нет, если такое есть, то laravel сразу бы ошибку выдал.
Это варнинг, а не ошибка, так что вполне может игнорироваться, в зависимости от настроек.

2) Вроде в ларе респонс должен указывать заголовки отдельно:
return response($content, 200)
            ->withHeaders([
                'Content-Type' => $type,
                'X-Header-One' => 'Header Value',
                'X-Header-Two' => 'Header Value',
            ]);


3) Попробуйте завести вручную:
В контроллере вместо return $pdf->download($filename); сделайте руками вывод заголовков и ечо содержимого пдф, затем ексит. Если сработает - значит респонс дополнительно обрабатывается после ретурна из контроллера...
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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