|
|
|
| Что я хочу:
пользователь вводит цифры с защитной картинки и жмёт кнопку,после чего просходит смена страницы и автоматически выводится окно диалога обработки файла.
*****
Сейчас всё работает но после ввода защитного кода ( если он правильный ) смены содержимого страницы не происходит!!!
Подскажите как сначала сменить содержимое страницы а потом направить файл пользователю???
Вот код
$sql_line="SELECT * FROM `$sql_tabl` WHERE id=$id";
$res=mysql_query($sql_line)or die("БАЗА ДАННЫХ НЕДОСТУПНА <br />Нет такого файла");
$out['{main}'].='<p> Информация о файле<p/>';
while ($line = mysql_fetch_row($res))
{
$file_info['{ID}'].=$line[0];
$file_info['{Name}'].=$line[1];
$titlePlus=$line[1]."<br />";
$file_info['{Info}'].=$line[2];
$file_info['{Size}'].=$line[3];
$file_info['{Link}'].="/download/catalog/".$sql_tabl."/".$line[4];
$file_name=$line[4];
$file_link="catalog/".$sql_tabl."/".$line[4];
$file_info['{linkPic}'].="/download/catalog/fileimg/".$line[5];
$file_info['{Date}'].=$line[6];
$file_info['{NumDownload}'].=$line[7];
}
$templates['file_info']=file_get_contents($ini['dirTemplates'].'file_info.tpl');
$out['{main}'].=strtr($templates['file_info'], $file_info);
if (file_exists($file_link))
{
if (!empty($_POST['securityCode']))
{
if(strtolower($_POST['securityCode'])==$HTTP_SESSION_VARS['securityCode'] || strtolower($_POST['securityCode'])==$_SESSION['securityCode'])
{
$out['{main}'].= '<font color="green">Защитный код верен!</font><br />';
download_file($file_name,$file_link);
$id=$file_info['{ID}'];
//connect_SQL($sql_host,$sql_login,$sql_pass,$sql_db);
$num_update=$file_info['{NumDownload}']+1;
$sql_NumDownload="UPDATE $sql_tabl SET NumDownload ='$num_update' WHERE id=$id";
$sql_NumDownload_UPDATE= mysql_query($sql_NumDownload)or die("БАЗА ДАННЫХ НЕДОСТУПНА <br />NumDownload- неизменён");
}
else{
$out['{main}'].='<font color="red">Неверный защитный код!</font><br>';
$out['{main}'].=file_get_contents($ini['dirTemplates'].'cod.tpl');
}
}
else $out['{main}'].=file_get_contents($ini['dirTemplates'].'cod.tpl');
}
else
{
$out['{main}'].='<font color="red">ОШИБКА БАЗЫ ДАННЫХ<br />Нет такого файла</font><br>';
//$subject='Ошибка базы данных '.$ini['sitename'];
//$headers ='From:PostMaster@'.$_SERVER['SERVER_NAME'].br;
//$headers.='MIME-Version: 1.0'.br;
//$headers.='Content-type: text; charset=windows-1251'.br;
//$body='Нет файла ; '.$file_info['{Link}'].' Таблица '.$sql_tabl.' ID '.$file_info['{ID}'];
// mail('admin@******.ru', $subject, $body, $headers);
}
|
Функция download_file($file_name,$file_link);
function download_file($file_name,$file_link)
{
ob_end_clean();
// ******** Вариант 1
// Задаём имя, которое будет предложено
// клиенту для сохранения файла
header("Content-Disposition: attachment; filename=".$file_name);
// В качестве типа файла задаём бинарный поток
header("Content-type: application/octet-stream");
// Отправляем клиенту размер страницы
// в HTTP-заголовке Content-length
header("Content-length: ".filesize($file_name));
// Отправляем содержимое файла
//sleep(3); // задержка 10 секунд
// echo file_get_contents($file_link);
//fpassthru(fopen($file_link, 'rb'));
echo "<META HTTP-EQUIV='Refresh' CONTENT='0; URL=$file_name'>";
}
|
| |
|
|
|
|
|
|
|
для: Skiff
(18.01.2009 в 18:29)
| | Я думаю нужно после проверки кода, если он правильный, поставить в сессию пользователя флаг разрешающий скачивать файлы (также ID файла или его путь+имя), потом вывести страницу с любым нужным вам содержимым и ссылкой "скачать файл" и потом только (когда пользователь нажмет на ссылку для скачивания) вызывать функцию download_file предварительно проверив данные в сессии.
Вот пример работы второй страницы, после проверки кода.
<?php
if(!isset($_GET['id'])){
echo "
<center>Сейчас начнется скачивание файла, если этого не произошло нажмите на <a href =\"?id=152447\">ссылку</a></center>
<SCRIPT LANGAUGE=\"JAVASCRIPT 1.3
TYPE=\"text/javascript\">
<!--
var URL = \"download.php?id=152447\"
var speed = 4000
function reload() {
location = URL
}
setTimeout(\"reload()\", speed);
//-->
</script>
";
exit();
}
// Download
$filename="anime.mp3";
$filesize=filesize($filename);
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=$filename"); // имя файла которое будет показываться при скачивании
header("Content-type: audio/mpeg"); // миме тип файла, в данном случае для mp3
header("Accept-Ranges: bytes");
header("Content-Length: $filesize");// размер файла в байтах
print $contents;
?>
|
Повторяю ето только пример, для наглядности, без проверки сессии, но рабочий. | |
|
|
|
|
|
|
|
для: egoss
(21.01.2009 в 16:44)
| | Спасибо!
В таком ключе я не думал! | |
|
|
|
|
|
|
|
для: Skiff
(18.01.2009 в 18:29)
| |
<?
// Задаём имя, которое будет предложено
// клиенту для сохранения файла
header("Content-Disposition: attachment; filename=".$file_name);
// В качестве типа файла задаём бинарный поток
header("Content-type: application/octet-stream");
// Отправляем клиенту размер страницы
// в HTTP-заголовке Content-length
header("Content-length: ".filesize($file_name));
// Отправляем содержимое файла
//sleep(3); // задержка 10 секунд
// echo file_get_contents($file_link);
//fpassthru(fopen($file_link, 'rb'));
echo "<META HTTP-EQUIV='Refresh' CONTENT='0; URL=$file_name'>";
|
Это не корректно.
[поправлено модератором] | |
|
|
|