Сообщение от subzey
|
У php есть функция, которая открывает файл и отдает его содержимое клиенту (название не помню, но искать следует рядом с fpassthru). Также, есть функция с названием вроде is_client_aborted, которая проверяет, не отключился ли клиент.
Соответственно, если после вывода содержимого клиент не отключился, то файл скачан.
Сорри, конкретных имен функций не назову - я с телефона.
|
так я выше описал что если я делаю GET\POST из AJAX, то что бы я не делал в PHP(имею ввиду с заголовками), то файл не понятно куда скачивается(подозреваю где то в кеше браузера лежит), см. внимательно мой код выше.
Вообщем решил проблему:
var sname = getParam("sname");
var sid = getParam(sname);
var add_url = 'PHPSESSID=' + sid + '&sname=' + sname;
var php_get_dl_link = '../php/json_get_file.php';
var php_download_file = '../php/download.php?' + add_url;
var oSendingData = new Object();
oSendingData.session_id = sid;
oSendingData.session_name = sname;
function GetSelectedFiles(id){
if(id){
selectedIDs.length = 0;
uncheckSelection();
selectedIDs.push(id);
}
if(selectedIDs.length > 0 ){
oSendingData.file_list = selectedIDs;
$.post(php_get_dl_link,JSON.stringify(oSendingData),onDownload,'json');
}
else{
printStatusbar("Выберите файл(ы) для скачивания");
}
// Если скачиваем по иконки, то отчищаем массив
if(id)
selectedIDs.length = 0;
function onDownload(responce_json){
// Проверка ответа от сервера
checkAuthAndError(responce_json);
// Если получили ссылку на файл!
window.location.href = php_download_file + '&dl_file='+responce_json.download_link;
};
};
json_get_file.php
// Тут идет обработка файла, проверка авторизации и так далее ....
// Сохраняю путь к временному файлу, что бы его ни кто другой не спер!
$_SESSION['download_tmp_file'] = $file_name;
// .....
ну и потом сам download.php
<?php
ini_set('display_errors',1);
error_reporting(E_ALL);
ini_set('session.use_cookies',0);
// Подключаю настройки
include("./include/g_settings.inc.php");
$sname = $_GET['sname'];
$sid = $_GET['PHPSESSID'];
$filename = $_GET['dl_file'];
session_id($sid);
session_name($sname);
session_start(); // Запускам сессию
// Проверяем что сессия активна!
if(!isset($_SESSION['is_auth']) || $_SESSION['is_auth'] == 0){ // Если сессия не активна
$s_status = 0;
session_unset();
session_destroy();
Header("Location: ../index.html");
exit(1);
}
// Если установлена переменная сессия с ссылкой на скачку файла
if(isset($_SESSION['download_tmp_file'])){
// Проверяем что поступил запрос на скачку именно этого файла!
if($_SESSION['download_tmp_file'] == $filename){
header('Pragma: public'); // required
header('Expires: 0'); // no cache
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Last-Modified: '.gmdate ('D, d M Y H:i:s', filemtime ($filename)).' GMT');
header('Cache-Control: private',false);
header("Content-Type: application/zip\n");
header('Content-Disposition: attachment; filename="'.basename($filename).'"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.filesize($filename));
header('Connection: close');
// Отдаем файл в браузер
ob_clean();
flush();
if(readfile($filename)){
if(!unlink($filename)) // Удаляем файл, если не получилось то сообщаем об ошибки
echo "<h1>Error on remove file! Please contact a system administrator!</h1>"; // TODO: syslog
else
unset($_SESSION['download_tmp_file']); // Хотя все равно перезапишется!
}
else
echo "<h1>Error on download file! Please contact a system administrator!</h1>";
// TODO: syslog
}
else
{
echo "<h1>access denied!!!</h1>";
// TODO: syslog
}
}else{
echo "<h1>File not found!!!</h1>";
// TODO: syslog
}
?>