Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Закачка файлов через php скрипт с возможностью докачки (помогите дописать)
 
 автор: cyberface   (31.08.2006 в 18:24)   письмо автору
 
 

Думаю, такой скрипт может оказаться очень полезным для создания различных счетчиков закачек, или когда требуется полностью скрыть от пользователя несанкционированный прямой доступ к файлам.
Я сегодня нашел вот такой скрипт, вернее почти такой, я только заменил переменные вида
$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 он написал, что докачка не поддерживается =)
В общем, что-то не так со скриптом, надо бы его доработать.
Поможете? :)

   
 
 автор: cheops   (01.09.2006 в 09:32)   письмо автору
 
   для: cyberface   (31.08.2006 в 18:24)
 

Что передаётся в качестве параметра $_GET['name']? Приведите ссылку на этот файл.

   
 
 автор: cyberface   (01.09.2006 в 19:30)   письмо автору
 
   для: cheops   (01.09.2006 в 09:32)
 

да просто имя файла

   
 
 автор: cheops   (02.09.2006 в 12:28)   письмо автору
 
   для: cyberface   (01.09.2006 в 19:30)
 

Без дополнительного пути, только имя?

   
 
 автор: indexer   (26.10.2006 в 03:29)   письмо автору
 
   для: cheops   (02.09.2006 в 12:28)
 

думаю что уже разобрались но все равно отвечу.

ошибка в первой же строке

$fn = isset($_GET['name']);

isset возвращает true если указано имя файла или false если $name в GET запросе пустая.
от сюда в переменной fn не получает название файла

cheops, да все верно в get запросе указывается только имя файла без дополнительного пути, путь собирается во второй строке

$filename = './download/' . $fn;


Извините что поднял старую тему, просто сам столкнулся с отдачей файла php скриптом,
за исходник взял этот скрипт доукомплектовал работой с базой, и получилась нехилая статистика скачиваний, (первое обращение , докачка)
еще в скрипте не все заголовки правильно прописаны, а некоторые прописаны хоть и правильно, но неудобночитаемо.

   
 
 автор: Trianon   (26.10.2006 в 09:44)   письмо автору
 
   для: cyberface   (31.08.2006 в 18:24)
 

Правильнее было бы разобрать запрос диапазона согласно его синтаксису и выделить позиции как первого так и последнего байта запрошенного фрагмента.
Кроме того, скрипт стал был бы куда менее напряжным в смысле требуемых ресурсов, если бы при запросе конечного фрагмента (а таких запросов большинство, фактически указанная версия никаких других корректно исполнять и не умеет) применял бы стратегию не fread а fpassthru

   
 
 автор: indexer   (26.10.2006 в 14:13)   письмо автору
 
   для: Trianon   (26.10.2006 в 09:44)
 

Спасибо,
fpassthru действительно лучше работает.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования