Как использовать PHP для отправки файла CSV пользователю через вызов AJAX? - PullRequest
1 голос
/ 25 августа 2011

У меня есть файл PHP dataAPI.php, который возвращает массив данных, который либо сериализуется как JSON, либо (как я пытаюсь реализовать) в формате CSV. dataAPI.php доступен исключительно через вызовы AJAX, которые до сих пор отлично работали с данными JSON.

Проблема в том, что я хочу, чтобы на стороне клиента также была кнопка экспорта, которая при нажатии отправляла бы другой вызов AJAX для возврата тех же данных , сериализованных в формате CSV . Я знаю, что не могу отправлять файлы через AJAX, так как мне это сделать?

Я думал о создании файлов CSV на стороне сервера, а затем об отправке URL-адреса перенаправления в ответ на мой запрос AJAX. Если бы я сделал это, как я мог предотвратить два запроса, перезаписывающих файлы друг друга, и удалить уже использованные / старые файлы csv? Есть ли способ лучше? Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 25 августа 2011

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 голосов
/ 25 августа 2011

Вы можете поместить следующий код в файл и затем отправить ему запрос 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;
0 голосов
/ 25 августа 2011

Вы можете попытаться вернуть JSON в любом случае, за исключением того, что версия CSV будет возвращать объект JSON, имеющий одно значение - длинную строку, содержащую данные CSV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...