2017-04-01 94 views
0

我有下面的代码,在那里我生成随机数并尝试将它们下载为CSV文件。PHP代码下载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', ','); 

?> 

回答

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', ','); 
+0

非常感谢。 1-我希望这些值出现在屏幕上,所以我需要回声,但放置它会停止文件的下载。 +在生成的文件中,值不会被逗号分隔。 – tony9099

+1

您__必须了解只有__one__选项 - 可以下载文件或查看网页。有__NO__的方式来做这两个在PHP中。 –

+0

如果您需要用逗号分隔的值,则@gmc表示 - 将'$ input_array'传递给'fputcsv'。 –

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什么。

+0

认真 - 你把所有的值从一个阵列'$ input_array'到另一个阵列'$ fields'?为什么? –

+0

对,我多么傻...谢谢 – gmc