thinkphp5.1 导出csv文件不自动下载
时间: 2023-09-15 10:24:29 浏览: 160
thinkphp下 导入导出csv文件
想要实现导出csv文件后自动下载,可以在控制器中增加以下代码:
```php
// 设置响应头信息
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="filename.csv"');
header('Cache-Control: max-age=0');
// 获取数据列表(假设数据已经准备好了)
$dataList = [
['id'=>1,'name'=>'张三','age'=>20],
['id'=>2,'name'=>'李四','age'=>30],
['id'=>3,'name'=>'王五','age'=>40],
];
// 打开PHP文件句柄,php://output 表示直接输出到浏览器
$fp = fopen('php://output', 'a');
// 输出Excel列名信息
$head = ['编号','姓名','年龄'];
foreach ($head as $i => $v) {
$head[$i] = iconv('utf-8', 'gbk', $v);
}
// 将数据通过fputcsv写到文件句柄
fputcsv($fp, $head);
// 计数器
$cnt = 0;
// 每隔$limit行,刷新一下输出buffer,不要太大,也不要太小
$limit = 100000;
// 逐行取出数据,不浪费内存
foreach ($dataList as $data) {
$cnt++;
// 刷新一下输出buffer,防止由于数据过多造成问题
if ($limit == $cnt) { ob_flush(); flush(); $cnt = 0; }
foreach ($data as $i => $v) {
$data[$i] = iconv('utf-8', 'gbk', $v);
}
fputcsv($fp, $data); // 写入一行数据到CSV文件中
}
// 关闭文件句柄
fclose($fp);
```
其中,设置响应头信息可以让浏览器自动下载文件,而不是直接在页面中展示。
需要注意的是,由于数据量大的情况下,可能会导致内存溢出,因此可以采用逐行读取数据的方式,减少内存占用。同时,为了防止数据过多造成问题,可以设置一个计数器,每隔一定数量的数据就刷新一下输出buffer。
阅读全文