【问题标题】:php array to csv doesn't work for download filephp 数组到 csv 不适用于下载文件
【发布时间】:2017-04-13 11:25:01
【问题描述】:

在 wordpress woocommerce 安装中,我需要将一些自定义订单字段导出到 csv 文件。一切正常,只是我在下载的文件中没有得到正确的内容。

这是我的代码:

function array_to_csv_download($array, $filename = "export.csv", $delimiter=";") {
  header('Content-Type: text/csv');
  header('Content-Disposition: attachment; filename="'.$filename.'"');
  $output = fopen( get_temp_dir() . $filename, 'w');
  foreach ($array as $line) { 
    fputcsv( $output, $line );
  }
  fclose($output);
}

数组类似于

$array = array(
  array('Head1', 'Head2', 'Head3', 'Head4'),
  array('Data1', 'Data2', 'Data3', 'Data4'),
  array('Data5', 'Data6', 'Data7', 'Data8')
);

该功能位于自定义管理页面上,由提交按钮触发。

当我按下按钮时,会生成一个 csv 文件并将其写入临时文件夹,命名为 $filename。该文件工作正常。

由函数中的第二个标题条目强制自动下载的文件命名正确($filename),但内容是该自定义管理页面的源代码。

我不需要将该文件存储在临时文件夹中,它只是现在,直到自动下载工作。我尝试将 'php://temp' 或 'php://output' 放在 fopen 函数中,但这并没有改变下载文件的内容。

我错过了什么?

【问题讨论】:

  • 那么你在下载的文件中得到了什么内容?
  • 在您提供的函数中,您没有显示任何输出。您只是发送标题,就好像您要发送输出一样,然后写入文件并关闭它。您永远不会发送任何数据。你能显示输出数据的代码吗?或者,只需在 fclose() 后面加上 readfile(get_temp_dir() . $filename); 即可将内容输出到浏览器。
  • @MarkBaker 下载的文件内容就是那个页面的html源代码。
  • link 我了解到,我应该打开一个新页面,而不是在我的 csv 下载文件中生成 html 代码。但是我该如何实现呢?

标签: php wordpress fopen


【解决方案1】:
$data = array(
    array("firstname" => "Mary", "lastname" => "Johnson", "age" => 25),
    array("firstname" => "Amanda", "lastname" => "Miller", "age" => 18),
    array("firstname" => "James", "lastname" => "Brown", "age" => 31),
    array("firstname" => "Patricia", "lastname" => "Williams", "age" => 7),
    array("firstname" => "Michael", "lastname" => "Davis", "age" => 43),
    array("firstname" => "Sarah", "lastname" => "Miller", "age" => 24),
    array("firstname" => "Patrick", "lastname" => "Miller", "age" => 27)
  );

  function cleanData(&$str)
  {
    $str = preg_replace("/\t/", "\\t", $str);
    $str = preg_replace("/\r?\n/", "\\n", $str);
    if(strstr($str, '"')) $str = '"' . str_replace('"', '""', $str) . '"';
  }

  // file name for download
  $filename = "website_data_" . date('Ymd') . ".csv";

  header("Content-Disposition: attachment; filename=\"$filename\"");
  header("Content-Type: application/vnd.csv");

  $flag = false;
  foreach($data as $row) {
    if(!$flag) {
      // display field/column names as first row
      echo implode("\t", array_keys($row)) . "\n";
      $flag = true;
    }
    array_walk($row, 'cleanData');
    echo implode("\t", array_values($row)) . "\n";
  }

  exit;

【讨论】:

  • 我仍然在我下载的文件中获得了 html 源代码,但至少预期的 csv 行现在放在关闭的表单标记之后。
猜你喜欢
  • 1970-01-01
  • 2023-01-26
  • 2019-07-22
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多