PHP实现浏览器文件下载

实际工作中,运营同学经常有获取数据的需求,写个脚本每次还需要手动执行导出数据给她们。有时候,需求在假期就很尴尬,提供一个让她们自己下载的接口是节省自己时间最好的办法。

// http://i.api.niliu.me/tool/index?id=1&flag=download
class Tool
{
    public function indexAction
    {
        // 获取参数$id $flag
        // 从db中获取数据$datas
        $datas = $this->getData($id);

        // 支持两种方式,接口返回;下载
        if ($flag != 'download') {
            if (!headers_sent()) {
                header('Content-type: application/json; charset=utf-8', TRUE);
            }
            echo json_encode($result);
            exit();
        } else {
            // 设置浏览器下载
            header('Content-Description: File Transfer');
            header('Content-type: application/octet-stream');
            header('Content-Transfer-Encoding: binary');
            // 触发浏览器文件下载功能
            header("Content-Disposition: attachment; filename=data" . $filename . '_' . date('Ymd') . '.csv');

            // 输出第一行内容         
            echo 'uid' . "\r\n";
            foreach ($datas as $data) {
                echo $data['id'] . "\r\n";

                ob_flush();
                flush();
            }
        }
    }
}

https://stackoverflow.com/questions/2832010/what-is-output-buffering
https://segmentfault.com/a/1190000003109808

文件下载
https://segmentfault.com/a/1190000010912097
https://www.jianshu.com/p/f10640cc3c2f

http://php.net/manual/zh/function.ob-get-level.php

问题:
0、php.ini中开启了ob有效吗?
output_buffering = 4096
1、ob_start();添加了cli中get_ob_level()返回0
2、浏览器下载,开启了ob应该更快,为啥还需要ob_flush;测试不加ob_flush很慢。

发表评论

电子邮件地址不会被公开。 必填项已用*标注