从 codeigniter mysql 下载 csv

Posted

技术标签:

【中文标题】从 codeigniter mysql 下载 csv【英文标题】:Download csv from codeigniter mysql 【发布时间】:2014-01-17 09:10:05 【问题描述】:

我想我遗漏了一些明显的东西。我正在尝试将数据集从 mysql 查询导出到 CSV,而不将其打印到浏览器。

这是我的代码:

<?php

$this->load->helper('download');
$list = $stories;
$fp = fopen('php://output', 'w');

foreach ($list as $fields) 
    fputcsv($fp, $fields);


$data = file_get_contents('php://output'); // Read the file's contents
$name = 'data.csv';
force_download($name, $data);
fclose($fp);

?>

$stories 是我从 MySQL 查询创建的数组。

目前所有内容都打印到浏览器,没有错误,也没有下载,但我想强制下载 CSV。我该怎么做?


最终工作代码:

 $this->load->helper('download');

    $list = $stories;
    $fp = fopen('php://output', 'w');
    foreach ($list as $fields) 
        fputcsv($fp, $fields);
        

    $data = file_get_contents('php://output'); 
    $name = 'data.csv';

    // Build the headers to push out the file properly.
    header('Pragma: public');     // required
    header('Expires: 0');         // no cache
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Cache-Control: private',false);
    header('Content-Disposition: attachment; filename="'.basename($name).'"');  // Add the file name
    header('Content-Transfer-Encoding: binary');
    header('Connection: close');
    exit();

    force_download($name, $data);
    fclose($fp);

【问题讨论】:

你需要输出一个Header来强制下载(我认为这是最好的方式) 谢谢,我确实尝试过,但下载的 csv 包含我的 html 而不是数据库中的数据。我正在使用这个附加代码header('Content-type: application/csv'); header('Content-Disposition: attachment; filename="data.csv"'); 您是否制作了正确的 csv 文件?当您在浏览器中打开它时,它允许您将其保存到桌面吗? 是的,将文件保存到桌面,但我下载的 csv 文件充满了 html 而不是数据库查询 你是如何创建文件的? 【参考方案1】:

您可以从控制器调用模型CSV()

$this->load->model('Users_model');
$this->Users_model->csv();

在模型中

function csv()

        $this->load->dbutil();
        $this->load->helper('file');
        $this->load->helper('download');
        $query = $this->db->query("SELECT * FROM Users");
        $delimiter = ",";
        $newline = "\r\n";
        $data = $this->dbutil->csv_from_result($query, $delimiter, $newline);
        force_download('CSV_Report.csv', $data);

您的文件将开始下载

【讨论】:

【参考方案2】:

我不知道 Codeigniter force_download() 函数集中设置了哪些标头。如果它确实要进入屏幕,我会怀疑缺少必要的标题。您可以将以下标头添加到您的代码中以设置正确的 csv 下载标头(缓存控制将确保每次下载新数据:

header('Content-Description: File Transfer');
header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename='.$name);
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));

【讨论】:

我添加了这段代码并删除了旧的重复项,现在我得到了一个空白的 csv? 您可能没有将数据流式传输回来。这可以通过一个简单的echo $data 来完成 嗯仍然给我一个空白文件。我已经更新了上面的代码,以向您展示我在做什么,以防我犯了一个愚蠢的错误 根据您的建议进行了更多搜索后,我找到了this post。我偷了代码,一切正常 - 见上文。【参考方案3】:

我正在使用它和它的工作

  header('Content-Type: text/csv; charset=utf-8');
            header('Expires: 0');
            header('Cache-Control: must-revalidate');
            header("Content-Disposition: attachment; filename=backup" . date('y-m-d') . ".csv");
            header('Last-Modified: ' . date('D M j G:i:s T Y'));
            $outss = fopen("php://output", "w");
            $this->db->order_by('ID', 'DESC');
            $query = $this->db->get('urls');
            foreach ($query->result_array() as $rows) 
                fputcsv($outss, $rows);
            
            fclose($outss);
            return;

【讨论】:

【参考方案4】:

如果您尝试生成 csv 格式的报告,那么使用 codeigniter 会很容易。

将此代码放入您的控制器中

function get_report()

    $this->load->model('Main_Model');
    $this->load->dbutil();
    $this->load->helper('file');
    /* get the object   */
    $report = $this->Main_Model->print_report();
    $delimiter = ",";
    $newline = "\r\n";
    $new_report = $this->dbutil->csv_from_result($report, $delimiter, $newline);
    write_file( 'application/third_party/file.csv', $new_report);
    $this->load->view('report_success.php');


将此代码放入模型中

public function print_report()

    return $query = $this->db->query("SELECT * FROM Table_name");
 

report_success.php 只是成功通知。

您的报告正在导出。谢谢


您的“file.csv”终于生成了。 它基本上存储在物理存储中。 在CodeIgniter/application/third-party/file.csv


它有效。 它会帮助你。

【讨论】:

我怎样才能在浏览器中直接下载而不是存储在所需的位置?【参考方案5】:

这里我们有来自 MySQL 的示例结果集,并希望导出为 CSV 文件。

第一步:获取键值对中的MySql数据。

$data = array(
         '0' => array('Name'=> 'Parvez', 'Status' =>'complete', 'Priority'=>'Low', 'Salary'=>'001'),
         '1' => array('Name'=> 'Alam', 'Status' =>'inprogress', 'Priority'=>'Low', 'Salary'=>'111'),
         '2' => array('Name'=> 'Sunnay', 'Status' =>'hold', 'Priority'=>'Low', 'Salary'=>'333'),
         '3' => array('Name'=> 'Amir', 'Status' =>'pending', 'Priority'=>'Low', 'Salary'=>'444'),
         '4' => array('Name'=> 'Amir1', 'Status' =>'pending', 'Priority'=>'Low', 'Salary'=>'777'),
         '5' => array('Name'=> 'Amir2', 'Status' =>'pending', 'Priority'=>'Low', 'Salary'=>'777')
        );

第 2 步:获取选项类型并强制浏览器下载文件而不是显示的 PHP 代码。

if(isset($_POST["ExportType"]))

switch($_POST["ExportType"])

    case "export-to-csv" :
        // Submission from
        $filename = $_POST["ExportType"] . ".csv";       
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Content-type: text/csv");
        header("Content-Disposition: attachment; filename=\"$filename\"");
        ExportCSVFile($data);
        //$_POST["ExportType"] = '';
        exit();
    default :
        die("Unknown action : ".$_POST["action"]);
        break;

function ExportCSVFile($records) 
    // create a file pointer connected to the output stream
    $fh = fopen( 'php://output', 'w' );
    $heading = false;
        if(!empty($records))
          foreach($records as $row) 
            if(!$heading) 
              // output the column headings
              fputcsv($fh, array_keys($row));
              $heading = true;
            
            // loop over the rows, outputting them
             fputcsv($fh, array_values($row));

          
          fclose($fh);

第 3 步:定义 html 布局以在表格和按钮中显示数据以触发 export-to-csv 操作。

<div><a href="javascript:void(0)" id="export-to-csv">Export to csv</a></div>
<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post" id="export-form">
                    <input type="hidden" value='' id='hidden-type' name='ExportType'/>
                  </form>
              <table id="" class="table table-striped table-bordered">
                <tr>
                    <th>Name</th>
                    <th>Status</th>
                    <th>Priority</th>
                    <th>Salary</th>
              </tr>
            <tbody>
              <?php foreach($data as $row):?>
              <tr>
              <td><?php echo $row ['Name']?></td>
              <td><?php echo $row ['Status']?></td>
              <td><?php echo $row ['Priority']?></td>
              <td><?php echo $row ['Salary']?></td>
              </tr>
              <?php endforeach; ?>
            </tbody>
          </table>

第 3 步:现在我们将使用 jQuery 代码来获取点击事件。

 <script  type="text/javascript">
$(document).ready(function() 
jQuery('#export-to-csv').bind("click", function() 
var target = $(this).attr('id');
switch(target) 
    case 'export-to-csv' :
    $('#hidden-type').val(target);
    //alert($('#hidden-type').val());
    $('#export-form').submit();
    $('#hidden-type').val('');
    break

);
    );
</script>

【讨论】:

以上是关于从 codeigniter mysql 下载 csv的主要内容,如果未能解决你的问题,请参考以下文章

根据列的字符串长度从 MySQL 中选择 - CodeIgniter [重复]

使用 CodeIgniter 从 mysql 数据库中随机记录

使用 PHP + CodeIgniter 从 MySQL 数据库生成无序列表

无法从codeigniter中的mysql表中获取一些特殊字符

尝试使用 Ajax 从远程服务器下载文件,但 Codeigniter 不起作用

如何使用codeigniter从mysql中获取多个多维数组中的数据?