Пользователь может загрузить результаты запроса в формате CSV. Файл небольшой (несколько КБ), но его содержимое важно.
Первый подход заключается в использовании выходного буфера php php://
:
$callback = function() use ($result, $columns) {
$file = fopen('php://output', 'w');
fputcsv($file, $columns);
foreach($result as $res) {
fputcsv($file, array($res->from_user, $res->to_user, $res->message, $res->date_added));
}
fclose($file);
};
return response()->stream($callback, 200, $headers);
Второй подход - создать новую папку в системе хранения laravels, установить ее в приватную и загрузить файл оттуда. Вы даже можете удалить файл после загрузки:
'csv' => [
'driver' => 'local',
'root' => storage_path('csv'),
'visibility' => 'private',
],
Вот код создания/загрузки:
$file = fopen('../storage/csv/file.csv', 'w');
fputcsv($file, $columns);
foreach($result as $res) {
fputcsv($file, array($res->from_user, $res->to_user, $res->message, $res->date_added));
}
fclose($file);
return response()->make(Storage::disk('csv')->get('file.csv'), 200, $headers);
Этот возврат сразу удалит файл после загрузки:
return response()->download(Storage::disk('csv')->path('file.csv'))
->deleteFileAfterSend(true);
Что будет безопаснее? Какой подход лучше? Я в настоящее время склоняюсь ко второму подходу с хранилищем.