【问题标题】:Download csv from codeigniter mysql从 codeigniter mysql 下载 csv
【发布时间】: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 而不是数据库查询
  • 你是如何创建文件的?

标签: php mysql codeigniter csv


【解决方案1】:

我不知道 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 来完成
  • hmmm 仍然给我一个空白文件。我已经更新了上面的代码,以向您展示我在做什么,以防我犯了一个愚蠢的错误
  • 根据您的建议进行了更多搜索后,我找到了this post。我偷了代码,一切正常 - 见上文。
【解决方案2】:

您可以从控制器调用模型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);
}

您的文件将开始下载

【讨论】:

    【解决方案3】:

    如果您尝试生成 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


    它有效。 它会帮助你。

    【讨论】:

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

    这里我们有来自 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>
    

    【讨论】:

      【解决方案5】:

      我正在使用它和它的工作

        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;
      

      【讨论】:

        猜你喜欢
        • 2014-07-09
        • 1970-01-01
        • 1970-01-01
        • 2014-10-15
        • 2022-01-09
        • 2014-03-28
        • 2012-08-09
        • 2011-08-28
        相关资源
        最近更新 更多