簡體   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