2011-08-25 33 views
1

我有一個PHP文件dataAPI.php,它返回一個序列化爲JSON或(如我試圖實現)CSV的數據數組。 dataAPI.php專門通過AJAX調用進行訪問,到目前爲止JSON數據運行良好。如何使用PHP通過AJAX調用將CSV文件發送給用戶?

問題是,我想在客戶端也有一個導出按鈕,當點擊它時,會發送另一個AJAX調用返回以CSV格式序列化的相同數據。我知道我不能通過AJAX發送文件,那麼我該怎麼做呢?

我想過在服務器端創建CSV文件,然後發送重定向url作爲對我的AJAX請求的響應。如果我這樣做了,我怎麼能阻止兩個請求覆蓋其他文件,並刪除已訪問/舊csv文件?有沒有更好的辦法?任何幫助表示讚賞。

+0

這個問題我有你需要的答案:http://stackoverflow.com/questions/921037/jquery-table- to-csv-export – lamelas

+0

看看http://stackoverflow.com/questions/3346072/download-csv-file-using-ajax –

回答

0

在這兩種情況下,您都可以嘗試返回JSON,但CSV版本將返回具有一個值的JSON對象 - 包含CSV數據的長字符串。

+0

我不是很精通PHP,但唯一的方法來轉換我看到的CSV格式的數組是使用'fputcsv()'輸出到一個文件。有沒有辦法直接把它變成一個字符串? – theabraham

+0

試試'implode()'方法 - http://php.net/manual/en/function.implode.php –

0

1)對於AJAX調用,在服務器上的某個地方創建文件併發送一個鏈接回 - 這個鏈接然後可以或者重定向到(例如,在子窗口),或點擊...

2 )爲防止數據被不同請求覆蓋,請創建一個唯一的文件名服務器端(例如,使用uniq_id()函數)。您仍然可以使用header()標記以相同的文件名發送它們。請確保您刪除這些文件,一旦你確信你不再需要它們(我個人使用家政腳本如下所示:

$timeout = 43200; // Max age in seconds 
$cleanPaths = array("ps_files/"); // The directory to autoclean 

foreach ($cleanPaths as $URLPath) { 
    if ($handle = opendir($URLPath)) { 
     while (false !== ($file = readdir($handle))) { 
      if ((substr($file, 0, 1) !== ".") && ((time() - filectime($URLPath . $file)) >= $timeout)) { 
       unlink($URLPath . $file); 
      } 
     } 
    } 
} 
0

你可以把下面的代碼在一個文件中,然後發送一個XHR請求,它。調用該文件,或者你可以嘗試打開該文件在一個單獨的工具較少彈出

$result = mysql_query("SHOW COLUMNS FROM `$table`"); 
$i = 0; 
if (mysql_num_rows($result) > 0) { 
    while ($row = mysql_fetch_assoc($result)) { 
     $csv_output .= $row['Field'].", "; 
     $i++; 
    } 
} 
$csv_output .= "\n"; 

$values = mysql_query("SELECT * FROM `$table`"); 
while ($rowr = mysql_fetch_row($values)) { 
    for ($j=0;$j<$i;$j++) { 
     $csv_output .= $rowr[$j].", "; 
    } 
    $csv_output .= "\n"; 
} 

$filename = $file."_".date("Y-m-d_H-i",time()); 
header("Content-type: application/vnd.ms-excel"); 
header("Content-disposition: csv" . date("Y-m-d") . ".csv"); 
header("Content-disposition: filename=".$filename.".csv"); 
print $csv_output; 
相關問題