2016-11-29 89 views
0

在wordpress woocommerce安裝中,我需要將一些自定義訂單字段導出到csv文件。一切正常,只有我沒有在下載的文件中獲得正確的內容。php數組到csv不適用於下載文件

這裏是我的代碼:

function array_to_csv_download($array, $filename = "export.csv", $delimiter=";") { 
    header('Content-Type: text/csv'); 
    header('Content-Disposition: attachment; filename="'.$filename.'"'); 
    $output = fopen(get_temp_dir() . $filename, 'w'); 
    foreach ($array as $line) { 
    fputcsv($output, $line); 
    } 
    fclose($output); 
} 

數組是一樣的東西

$array = array(
    array('Head1', 'Head2', 'Head3', 'Head4'), 
    array('Data1', 'Data2', 'Data3', 'Data4'), 
    array('Data5', 'Data6', 'Data7', 'Data8') 
); 

該功能位於自定義管理頁面上,由一個提交按鈕觸發。

當我按下按鈕時,會生成一個csv文件並寫入臨時文件夾,名爲$ filename。該文件正常工作。

由函數中的第二個標頭條目強制自動下載的文件名稱正確($ filename),但內容是該自定義管理頁面的源代碼。

我不需要將該文件存儲在臨時文件夾中,直到自動下載工作爲止。我試圖把'php:// temp'或'php:// output'放在fopen函數中,但是這並沒有改變下載文件的內容。

我缺少什麼?

+1

那麼你在下載的文件中得到了什麼內容? –

+1

[如何從php腳本創建並下載csv文件?](http://stackoverflow.com/questions/16251625/how-to-create-and-download-a-csv-file-from-php -script) – Ima

+0

在你提供的函數中你沒有顯示任何輸出。你只是發送標題,就好像你要發送輸出,然後寫入文件並關閉它。你永遠不會發送任何數據。你能顯示輸出數據的代碼嗎?或者,只需使用'readfile(get_temp_dir()。$ filename)'按照fclose();'將內容輸出到瀏覽器。 – Kalkran

回答

0
$data = array(
    array("firstname" => "Mary", "lastname" => "Johnson", "age" => 25), 
    array("firstname" => "Amanda", "lastname" => "Miller", "age" => 18), 
    array("firstname" => "James", "lastname" => "Brown", "age" => 31), 
    array("firstname" => "Patricia", "lastname" => "Williams", "age" => 7), 
    array("firstname" => "Michael", "lastname" => "Davis", "age" => 43), 
    array("firstname" => "Sarah", "lastname" => "Miller", "age" => 24), 
    array("firstname" => "Patrick", "lastname" => "Miller", "age" => 27) 
); 

    function cleanData(&$str) 
    { 
    $str = preg_replace("/\t/", "\\t", $str); 
    $str = preg_replace("/\r?\n/", "\\n", $str); 
    if(strstr($str, '"')) $str = '"' . str_replace('"', '""', $str) . '"'; 
    } 

    // file name for download 
    $filename = "website_data_" . date('Ymd') . ".csv"; 

    header("Content-Disposition: attachment; filename=\"$filename\""); 
    header("Content-Type: application/vnd.csv"); 

    $flag = false; 
    foreach($data as $row) { 
    if(!$flag) { 
     // display field/column names as first row 
     echo implode("\t", array_keys($row)) . "\n"; 
     $flag = true; 
    } 
    array_walk($row, 'cleanData'); 
    echo implode("\t", array_values($row)) . "\n"; 
    } 

    exit; 
+0

我仍然在我的下載中獲得html源代碼文件,但至少預期的csv-line會放在現在封閉的表單標籤之後。 – krabbe