У меня есть webapp, который имитирует терминал. Каждая команда размещена с помощью AJAX, используя следующий сценарий (часть):
AJAX/Jquery
$.post("sec/cmd_process.php", { n : n })
.done(function(data){
output.append(display(data));
});
Если пользователь download log
в терминал, следующий сценарий - на sec/cmd_process.php
выполняется:
PHP
if(isset($_POST['n'])){
echo $_POST['n'];
$t = explode(' ', $_POST['n']);
if(strtolower($t[0])=='download'){
if(!isset($t[1])) shout_error("No download specified");
//Download Log
elseif($t[1]=='log'){
$stmt = $dbh->prepare("SELECT * FROM `tap_log` ORDER BY `time`");
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach($rows as $row) {
$user = user_by_id($row['user']);
$data.= "{$row['time']} - User {$user['id']} ({$user['name1']} {$user['name2']}) - {$row['information']} ({$row['subject']})".PHP_EOL;
}
$handle = fopen('log.txt','w+');
fwrite($handle, $data);
$path = 'log.txt';
header('Content-Transfer-Encoding: binary');
header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($path)).' GMT');
header('Accept-Ranges: bytes');
header('Content-Length:'.filesize($path));
header('Content-Encoding: none');
header('Content-Disposition: attachment; filename='.$path);
readfile($path);
fclose($handle);
}
}
}
Что я хочу сделать для сгенерированного файла, log.txt
, загружается через диалог «Сохранить как ...». Этот код работает, если вы непосредственно посещаете страницу PHP с этими заголовками, но как я могу заставить ее работать через jQuery/AJAX?
Загрузка Force невозможна через ajax, AFAIK – Varun
Есть ли альтернатива? – Ben
Либо прямая переадресация на PHP, либо навязчивое решение создает скрытый '', где href перенаправляет пользователя на страницу PHP, и вы можете принудительно загрузить его. – Varun