首页 > 解决方案 > 如何在 Laravel 5.7 中从当前视图流式传输下载数据

问题描述

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

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

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

我在想我可以通过将数据从处理查询的控制器发送到处理下载的控制器,然后再将其发送到视图来缓存结果,但我不知道如何实现这一点,或者 Laravel 是否提供了更好的方法来做什么我想。

标签: phplaravel-5.7

解决方案


这就是我在view用户想要下载csv文件时使用 Laravel 5.6 的方式。请注意,您应该传递Builderobject 而不是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();

推荐阅读