我有一个PHP文件dataAPI.php
,它返回一个序列化为JSON或(我正在尝试实现)CSV的数据数组。 dataAPI.php
只能通过AJAX调用访问,到目前为止,JSON数据已经正常工作。
问题是,我想在客户端也有一个导出按钮,单击该按钮时,将发送另一个AJAX调用以返回以CSV格式序列化的相同数据。我知道我不能通过AJAX发送文件,所以我该怎么做呢?
我想过在服务器端创建CSV文件,然后发送redirect-url作为对我的AJAX请求的响应。如果我这样做了,我怎么能阻止两个请求覆盖彼此的文件并删除已经访问/旧的csv文件?有没有更好的办法?任何帮助表示赞赏。
答案 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;