ERR_INVALID_RESPONSE当我尝试下载csv文件时


ERR_INVALID_RESPONSE when i try to download csv file?

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

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

您要做的是从hidden_data字段中获取JSON数据。将其传递到后端。但是,然后让他们将结果下载为CSV文件。

首先,让我们谈谈标头。你不需要那么多。事实上,你实际上是在告诉浏览器胡扯。如果您希望浏览器将请求作为 CSV 文件获取,则需要这两个标头。

header('Content-Type: text/csv; charset=utf-8');
header("Content-Disposition: attachment; filename=$filename.csv");

此外,您将需要一个实际的CSV文件才能下载。PHP 使用流来处理这个问题,这很好,因为你也可以伪造一个。

$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)));
    }
  }
}

我希望这是有帮助的,并让你走上正确的轨道。

参考