Показать сообщение отдельно
  #5 (permalink)  
Старый 04.09.2010, 15:46
Новичок на форуме
Отправить личное сообщение для doom_man Посмотреть профиль Найти все сообщения от doom_man
 
Регистрация: 04.09.2010
Сообщений: 3

Сообщение от 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
}


?>
Ответить с цитированием