如何在Laravel 5.7中从当前视图流式下载数据

时间:2018-11-07 19:10:28

标签: php laravel-5.7

我正在制作一个基本的数据库应用程序,该应用程序允许用户通过表单提交搜索参数并在视图中显示结果。我从一个雄辩的模型创建一个查询,进行分页,然后将结果发送到视图。

我想在结果视图上放置一个链接,该链接使用户可以将查询结果下载到csv文件中,但可以流式传输数据而不是创建文件然后提供服务。我的问题是我不知道如何将查询从结果页面通过路由传递到另一个负责下载的控制器。

我发现的有关将数据发送到路由的信息涉及为url发送参数,但我不确定该参数对我有帮助。

我当时想我可以通过将数据从处理查询的控制器发送到处理下载的控制器,然后再将其发送到视图,从而缓存结果,但是我不确定如何完成此操作或Laravel是否提供了更好的方法做我想做的事。

1 个答案:

答案 0 :(得分:0)

当用户要下载view文件时,这就是我在csv中使用Laravel 5.6的方法。请注意,您应该传递Builder对象而不是LengthAwarePaginator。还要注意在send()之后的streamDownload方法,我必须弄清楚自己。

/** @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();