当我尝试执行此代码时,我得到了
ERR_INVALID_RESPONSE 并且未下载文件。
public function downloadcsv(){
//var_dump($this->export_arr);
if(isset($_POST['hidden_data'])){
// echo "hi";
$exportarr = $_POST['hidden_data'];
$exportarr = str_replace("\\", "",$exportarr);
$exportarr = json_decode($exportarr,true);
// print_r($exportarr[0]);
$filename = $exportarr[0]['System'] . date('Ymd') . ".csv";
header("Content-Disposition: attachment; filename=\"$filename\"");
header("Content-Type: application/vnd.ms-excel");
header("Content-Type: text/plain");
$data = $exportarr;
//print_r($data);
$flag = false;
foreach($data as $key=>$row) {
if(!$flag) {
// display field/column names as first row
echo implode("\t", array_keys($row)) . "\r\n";
$flag = true;
}
array_walk($row, 'cleanData');
echo implode("\t", array_values($row)) . "\r\n";
}
exit;
}
}
function cleanData(&$str)
{
$str = preg_replace("/\t/", "\\t", $str);
$str = preg_replace("/\r?\n/", "\\n", $str);
if(strstr($str, '"')) $str = '"' . str_replace('"', '""', $str) . '"';
}
注意:此数组不大。
这是什么原因?
hidden_data是隐藏输入的发布数据:
<?php echo form_open("system/downloadcsv",array('class' => 'downloadcsv')); ?>
<input type="hidden" class="hidden_data" name="hidden_data" />
<button type="submit" name="download_csv" class="btn-u btn-u-blue exportsys" disabled="disabled" title="Notice: First run system!">Export</button>
<?php echo form_close(); ?>
答案 0 :(得分:1)
所以你要做的就是从hidden_data字段中获取JSON数据。将它传递到后端。但是让他们将结果下载为CSV文件。
首先关闭。让我们谈谈标题。你不需要那么多。事实上,你实际上是在告诉浏览器采取废话。如果您希望浏览器将请求作为CSV文件接收,则这些是您需要的两个标头。
header('Content-Type: text/csv; charset=utf-8');
header("Content-Disposition: attachment; filename=$filename.csv");
此外,您还需要下载实际的CSV文件。 PHP使用streams来处理这个问题,这很好,因为你也可以伪造一个。
$output = fopen('php://output', 'w');
然后,您可以使用fputcsv
将列放入所需的列foreach($data as $datum) { fputcsv($output, $datum); }
最后。一个很好的清理代码可能看起来像这样:
public function downloadcsv(){
if(isset($_POST['hidden_data'])){
$data = json_decode(
str_replace('\', '', $_POST['hidden_data']);
);
$filename = $data[0]['System'] . date('Ymd') . ".csv";
header('Content-Type: text/csv; charset=utf-8');
header("Content-Disposition: attachment; filename=$filename");
$output = fopen('php://output', 'w');
$flag = false;
foreach($data as $key=>$row) {
if(!$flag) {
fputcsv($output(implode(",", array_keys($row)));
$flag = true;
}
array_walk($row, 'cleanData');
fputcsv(implode(",", array_values($row)));
}
}
}
我希望这会有所帮助,让你走上正轨。