PHP代码下载CSV文件不起作用

时间:2017-04-01 20:33:56

标签: php csv

我有以下代码,我生成随机数并尝试将它们下载为CSV文件。

如果我在另一个文件上单独尝试使用CSV代码段,则可以使用它,但在此代码中,它只是不起作用。我确实看到随机数回显,但它没有下载CSV文件。

<?php

$dataarray=array();

function convert_to_csv($input_array, $output_file_name, $delimiter)
{
$temp_memory = fopen('php://memory', 'w');
foreach ($input_array as $line) 
{
fputcsv($temp_memory, $line, $delimiter);
}

fseek($temp_memory, 0);
header('Content-Type: application/csv');
header('Content-Disposition: attachement; filename="' . $output_file_name . '";');
fpassthru($temp_memory);
}

for ($i = 0; $i <= 25000; $i++) 
{ 
  $num = (rand(50,110));

  array_push($dataarray,"$num");

  echo "Hearbeat #" .$i . "\t\t ------   " . $num;
  echo "<br>";
}

convert_to_csv($dataarray, 'data_as_csv.csv', ',');

?>

2 个答案:

答案 0 :(得分:1)

在使用header()发送标头之前输出数据意味着header()来电将具有效果。所以在标题之前发送任何内容是合理的。

正如另一个提到的答案 - fputcsv的第二个参数必须是数组,所以我也将调用更改为fputcsv

如果您希望使用逗号作为分隔符将所有值写入csv文件 - 将$input_array直接传递给fputcsv

因此,您的代码可能如下所示:

<?php
$dataarray=array();

function convert_to_csv($input_array, $output_file_name, $delimiter)
{
$temp_memory = fopen('php://memory', 'w');

// Option 1 - every number will be on a new line
foreach ($input_array as $line) 
{
// add `array($line)` not `$line`
fputcsv($temp_memory, array($line), $delimiter);
}

// Option 2 - all numbers will be in 
// one line with `$delimiter` as separator
fputcsv($temp_memory, $input_array, $delimiter);

fseek($temp_memory, 0);
header('Content-Type: application/csv');
header('Content-Disposition: attachement; filename="' . $output_file_name . '";');
fpassthru($temp_memory);
}

for ($i = 0; $i <= 25000; $i++) 
{ 
  $num = (rand(50,110));
  array_push($dataarray,"$num");

  // this two lines are nor needed
  //echo "Hearbeat #" .$i . "\t\t ------   " . $num;
  //echo "<br>";
}

convert_to_csv($dataarray, 'data_as_csv.csv', ',');

答案 1 :(得分:0)

实际上,问题出在convert_to_csv函数中。 fputcsv期望第二个参数是一个数组,在你的情况下是一个字符串。根据您的需要,您有2个选项:

1)单独一行中的每个数字:只需将fputcsv函数调用更改为:fputcsv($temp_memory, [$line], $delimiter);

2)同一行中的所有数字由$delimiter分隔:

function convert_to_csv($input_array, $output_file_name, $delimiter)
        {
            $temp_memory = fopen('php://memory', 'w');

            fputcsv($temp_memory, $fields, $delimiter);
            fseek($temp_memory, 0);
            header('Content-Type: application/csv');
            header('Content-Disposition: attachement; filename="' . $output_file_name . '";');
            fpassthru($temp_memory);
        }

并且(我相信您已经知道),要自动下载文件,您不能echo任何内容。