当我尝试下载csv文件时ERR_INVALID_RESPONSE?

时间:2016-01-30 18:21:27

标签: php json codeigniter

当我尝试执行此代码时,我得到了

  

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(); ?>

1 个答案:

答案 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)));
    }
  }
}

我希望这会有所帮助,让你走上正轨。

reference