如何使用PHP通过AJAX调用向用户发送CSV文件?

时间:2011-08-25 13:58:20

标签: php ajax csv

我有一个PHP文件dataAPI.php,它返回一个序列化为JSON或(我正在尝试实现)CSV的数据数组。 dataAPI.php只能通过AJAX调用访问,到目前为止,JSON数据已经正常工作。

问题是,我想在客户端也有一个导出按钮,单击该按钮时,将发送另一个AJAX调用以返回以CSV格式序列化的相同数据。我知道我不能通过AJAX发送文件,所以我该怎么做呢?

我想过在服务器端创建CSV文件,然后发送redirect-url作为对我的AJAX请求的响应。如果我这样做了,我怎么能阻止两个请求覆盖彼此的文件并删除已经访问/旧的csv文件?有没有更好的办法?任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:0)

您可以尝试在任何一种情况下返回JSON,但CSV版本将返回具有一个值的JSON对象 - 包含CSV数据的长字符串。

答案 1 :(得分: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);
            }
        }
    }
}

答案 2 :(得分: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;