php - 如何在 Laravel 5.7 中从当前视图流式传输下载数据
问题描述
我正在制作一个基本的数据库应用程序,它允许用户通过表单提交搜索参数并将结果显示在视图中。我从 Eloquent 模型创建查询、分页,然后将结果发送到视图。
我想在结果视图上放置一个链接,让用户可以在 csv 文件中下载他们的查询结果,但是流式传输数据而不是创建一个文件然后提供它。我的问题是我不知道如何通过路由将查询从结果页面传递到另一个处理下载的控制器。
我发现的有关向路由发送数据的信息涉及为 url 发送参数,我不确定这对我有帮助。
我在想我可以通过将数据从处理查询的控制器发送到处理下载的控制器,然后再将其发送到视图来缓存结果,但我不知道如何实现这一点,或者 Laravel 是否提供了更好的方法来做什么我想。
解决方案
这就是我在view
用户想要下载csv
文件时使用 Laravel 5.6 的方式。请注意,您应该传递Builder
object 而不是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();
推荐阅读
- office365 - Office 365 服务运行状况上次更新是 24 小时前
- visual-studio - 使用 ITK 和 VTK 时的 Visual Studio 错误
- javascript - 按键后的打字效果
- html - css显示表的colspan不起作用
- java - 如何从内容 uri 获取 zip 文件的文件路径?
- jquery - 如何使用JQuery获取带有id后缀的html元素的值
- php - 如何通过按日期搜索生成多个文件?
- .net - 如何使用 Microsoft.Identity.Client.PublicClientApplication C# 验证 Azure 资源 API 的交互
- php - 如何从 Twitter API 数据中检索图像
- r - 在 R 中的 selectInput() 函数中选择的输入数