我有以下代码,我生成随机数并尝试将它们下载为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', ',');
?>
答案 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
任何内容。