Laravel: принудительно загружать строку, не создавая файл

Я создаю CSV, и я хочу, чтобы Laravel принудительно загрузил его, но в документации упоминается, что я могу загружать уже существующие файлы на сервере, и я хочу сделать это, не сохраняя данные в виде файла.

Мне удалось сделать это (что работает), но я хотел знать, есть ли другой, более аккуратный способ.

    $headers = [
        'Content-type'        => 'text/csv',
        'Content-Disposition' => 'attachment; filename="download.csv"',
    ];
    return \Response::make($content, 200, $headers);

Я также пробовал с SplTempFileObject(), но я получил следующую ошибку: The file "php://temp" does not exist

    $tmpFile = new \SplTempFileObject();
    $tmpFile->fwrite($content);

    return response()->download($tmpFile);

Ответ 1

Сделайте макрос ответа для более чистого подхода к размещению контента /laravel

Добавьте следующий способ загрузки App\Providers\AppServiceProvider

\Response::macro('attachment', function ($content) {

    $headers = [
        'Content-type'        => 'text/csv',
        'Content-Disposition' => 'attachment; filename="download.csv"',
    ];

    return \Response::make($content, 200, $headers);

});

то в вашем контроллере или маршрутах вы можете вернуть следующие

return response()->attachment($content);

Ответ 2

Попробуйте следующее:

// Directory file csv, You can use "public_path()" if the file is in the public folder
$file= public_path(). "/download.csv";
$headers = ['Content-Type: text/csv'];

 //L4
return Response::download($file, 'filename.csv', $headers);
//L5 or Higher
return response()->download($file, 'filename.csv', $headers);