Я создаю 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);