如何从 Laravel 5.7 中的当前视图流式传输下载数据
How to stream download data from current view in Laravel 5.7
我正在制作一个基本的数据库应用程序,允许用户通过表单提交搜索参数并将结果显示在视图中。我从 Eloquent 模型创建查询,分页,然后将结果发送到视图。
我想在结果视图上放置一个 link,让用户可以将他们的查询结果下载到一个 csv 文件中,但流式传输数据而不是创建一个文件然后提供它。我的问题是我不知道如何通过路由将查询从结果页面传递到处理下载的另一个控制器。
我找到的有关向路由发送数据的信息涉及发送 url 的参数,我不确定这对我有帮助。
我想我可以通过将数据从处理查询的控制器发送到处理下载的控制器,然后再将其发送到视图来缓存结果,但我不确定如何完成此操作,或者如果 Laravel 提供了一种更好的方法来做我想做的事。
当用户想要下载 csv
文件时,我在 view
中使用 Laravel 5.6 就是这样做的。请注意,您应该传递 Builder
对象而不是 LengthAwarePaginator
。还要注意 streamDownload
之后的 send()
方法,我必须自己弄清楚。
/** @var \Illuminate\Database\Query\Builder $results */
$callback = function () use ($results) {
$file = fopen('php://output', 'w');
// Set column names from the first result keys
fputcsv($file, array_keys((array)$results->first()));
// Get results in chunks to stream large downloads
$results->chunk(1000,
function ($rows) use ($file) {
foreach ($rows as $row) {
fputcsv($file, (array)$row);
}
}
);
fclose($file);
};
$headers = [
'Content-Type' => 'text/csv',
];
return response()->streamDownload($callback, 'filename.csv', $headers)->send();
我正在制作一个基本的数据库应用程序,允许用户通过表单提交搜索参数并将结果显示在视图中。我从 Eloquent 模型创建查询,分页,然后将结果发送到视图。
我想在结果视图上放置一个 link,让用户可以将他们的查询结果下载到一个 csv 文件中,但流式传输数据而不是创建一个文件然后提供它。我的问题是我不知道如何通过路由将查询从结果页面传递到处理下载的另一个控制器。
我找到的有关向路由发送数据的信息涉及发送 url 的参数,我不确定这对我有帮助。
我想我可以通过将数据从处理查询的控制器发送到处理下载的控制器,然后再将其发送到视图来缓存结果,但我不确定如何完成此操作,或者如果 Laravel 提供了一种更好的方法来做我想做的事。
当用户想要下载 csv
文件时,我在 view
中使用 Laravel 5.6 就是这样做的。请注意,您应该传递 Builder
对象而不是 LengthAwarePaginator
。还要注意 streamDownload
之后的 send()
方法,我必须自己弄清楚。
/** @var \Illuminate\Database\Query\Builder $results */
$callback = function () use ($results) {
$file = fopen('php://output', 'w');
// Set column names from the first result keys
fputcsv($file, array_keys((array)$results->first()));
// Get results in chunks to stream large downloads
$results->chunk(1000,
function ($rows) use ($file) {
foreach ($rows as $row) {
fputcsv($file, (array)$row);
}
}
);
fclose($file);
};
$headers = [
'Content-Type' => 'text/csv',
];
return response()->streamDownload($callback, 'filename.csv', $headers)->send();