|
|
|
| Думаю, такой скрипт может оказаться очень полезным для создания различных счетчиков закачек, или когда требуется полностью скрыть от пользователя несанкционированный прямой доступ к файлам.
Я сегодня нашел вот такой скрипт, вернее почти такой, я только заменил переменные вида
$HTTP_*_VARS на более новые, и добавил isset();
<?php
$fn = isset($_GET['name']);
$filename = './download/' . $fn;
if(strstr($fn, '/'))
{
// небольшая защита от попыток закачки из других каталогов
header($_SERVER["SERVER_PROTOCOL"] . " 403 Forbidden");
exit;
}
if(!file_exists($filename))
{
header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found");
exit;
}
$fsize = filesize($filename);
$ftime = date("D, d M Y H:i:s T", filemtime($filename));
$fd = fopen($filename, "rb");
if(!$fd)
{
header($_SERVER["SERVER_PROTOCOL"] . " 403 Forbidden");
exit;
}
// Если запрашивающий агент поддерживает докачку
if(isset($_SERVER["HTTP_RANGE"]))
{
$range = $_SERVER["HTTP_RANGE"];
$range = str_replace("bytes=", "", $range);
$range = str_replace("-", "", $range);
if($range)
fseek($fd, $range);
}
$content = fread($fd, $fsize);
fclose($fd);
if(isset($range))
header($_SERVER["SERVER_PROTOCOL"] . " 206 Partial Content");
else
header($_SERVER["SERVER_PROTOCOL"] . " 200 OK");
header("Content-Disposition: attachment; filename=$fn");
header("Last-Modified: $ftime");
header("Accept-Ranges: bytes");
header("Content-Length: " . ($fsize-$range) );
header("Content-Range: bytes $range-".($fsize -1). "/" . $fsize);
header("Content-Type: application/octet-stream");
print $content;
exit;
?>
|
Однако этот скрипт у меня не работает.
Пробовал качнуть файлик error.log, который я кинул в директорию со скриптом =)
Однако вместо того, что бы сохранить его как error.log Опера сохранила как error.htm
Пробовал качать через Download Master он написал, что докачка не поддерживается =)
В общем, что-то не так со скриптом, надо бы его доработать.
Поможете? :) | |
|
|
|
|
|
|
|
для: cyberface
(31.08.2006 в 18:24)
| | Что передаётся в качестве параметра $_GET['name']? Приведите ссылку на этот файл. | |
|
|
|
|
|
|
|
для: cheops
(01.09.2006 в 09:32)
| | да просто имя файла | |
|
|
|
|
|
|
|
для: cyberface
(01.09.2006 в 19:30)
| | Без дополнительного пути, только имя? | |
|
|
|
|
|
|
|
для: cheops
(02.09.2006 в 12:28)
| | думаю что уже разобрались но все равно отвечу.
ошибка в первой же строке
$fn = isset($_GET['name']);
|
isset возвращает true если указано имя файла или false если $name в GET запросе пустая.
от сюда в переменной fn не получает название файла
cheops, да все верно в get запросе указывается только имя файла без дополнительного пути, путь собирается во второй строке
$filename = './download/' . $fn;
|
Извините что поднял старую тему, просто сам столкнулся с отдачей файла php скриптом,
за исходник взял этот скрипт доукомплектовал работой с базой, и получилась нехилая статистика скачиваний, (первое обращение , докачка)
еще в скрипте не все заголовки правильно прописаны, а некоторые прописаны хоть и правильно, но неудобночитаемо. | |
|
|
|
|
|
|
|
для: cyberface
(31.08.2006 в 18:24)
| | Правильнее было бы разобрать запрос диапазона согласно его синтаксису и выделить позиции как первого так и последнего байта запрошенного фрагмента.
Кроме того, скрипт стал был бы куда менее напряжным в смысле требуемых ресурсов, если бы при запросе конечного фрагмента (а таких запросов большинство, фактически указанная версия никаких других корректно исполнять и не умеет) применял бы стратегию не fread а fpassthru | |
|
|
|
|
|
|
|
для: Trianon
(26.10.2006 в 09:44)
| | Спасибо,
fpassthru действительно лучше работает. | |
|
|
|