从 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表中获取一些特殊字符