繁体   English   中英

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

[英]PHP code to download CSV file not working

我有以下代码,在其中生成随机数,然后尝试将其下载为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', ',');

?>

与发送报头之前输出数据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', ',');

实际上,问题出在您的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任何内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM