Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Сеть > Контролируемое скачивание


Автор: Black Rabbit 11.1.2007, 02:01
Всем привет! 
Подскажите пожалуйста, насколько возможно реализовать такую задачу:

Имеется сайт на котором можно  приобрести электронные журналы
Человек выбирает интересующие файлы и добавляет в корзину.
После оплаты все файлы загоняются в зип архив и отдаются на скачивание
Требуется  докачка и поддержка менеджеров закачек
Должна быть проверка, докачался ли файл до конца - если да, то запрещать повторное скачивание

  
На данный момент вижу только 2 способа реализации - отдача файла по фтп через скрипт, тогда можно реализовать докачку и проконтролировать конец скачивания, но многопоточность и архивирование отпадают

Либо реализовывать через символические линки   -   но как в таком случае узнать, был ли файл докачан 
до конца?

Что же касается предварительного архивирования, по-моему эта задача нерешаема....  не плодить же на сервере многочисленные временные архивы .....

Буду благодарна любым советам  smile 
  

Автор: PARROT 11.1.2007, 10:58
Black Rabbit, посмотри тут: http://evgeny.neverov.name/articles/pretty-good-download/

Автор: Black Rabbit 11.1.2007, 14:21
Это и есть то, о чем я говорю- способ №1. Только я по фтп передаю файл
Код

if(isset($_SERVER["HTTP_RANGE"]))  {
 header ("HTTP/1.1 206 Partial Content");
  .........
 
}
else{
  header ("HTTP/1.1 200 OK"); 
  .......
}

$out = fopen("php://output", "w"); 
if(ftp_fget($ftp, $out, $download[1], FTP_BINARY,$range)) {

  # файл докачался полностью, пишем в логи, удаляем из корзины
}
 


Но при таком подходе возникает проблема с менеджерами закачек - приходится ограничивать  скачивание одним потоком,
иначе файл приходит битым

Автор: Mal Hack 11.1.2007, 14:53
Глянь еще вот это: http://pear.php.net/package/HTTP_Download
Думается мне, что тут бы файл через потоки stream открыть...
Интересно из-за чего бьется. В принципе или из-за FTP.
Не сталкивался с такой задачей, но она интересная.

Автор: Black Rabbit 11.1.2007, 23:13
Кажется разобралась!
Надо было при коннекте к фтп отключить опцию  FTP_AUTOSEEK

Вот так работает многопоточно и с докачкой
Код

if(isset($_SERVER["HTTP_RANGE"])) 
  {

    preg_match ("/bytes=(\d+)-/", $_SERVER["HTTP_RANGE"], $offset); 
    $offsetSize=intval($offset[1]);
    $contentSize = $fileSize - $offsetSize; 
      
   header ("HTTP/1.1 206 Partial Content"); 
   header ("Content-Range: bytes " . $offsetSize. "-" .($fileSize-1). "/" .$fileSize); 

  } 
  else 
  {        
      $offsetSize= 0;
      $contentSize = $fileSize;    
      header ("HTTP/1.1 200 OK"); 
  } 
 ......
 header ("Content-Length: " . $contentSize);
 header ("Content-Disposition: attachment; filename=\"".$file_basename."\""); 
 header ("Content-Type: application/octet-stream"); 
 header ("Proxy-Connection: close"); 
 header ("");

$out = fopen("php://output", "w"); 

ftp_set_option($ftp, FTP_AUTOSEEK, false);   #!!!!!!!!

if(ftp_fget($ftp, $out, $file, FTP_BINARY,$offsetSize)){
  
    .....
  }


Только скачивается медленно идет по сравнению с прямым линком. 
Попробую переписать то же самое на Perl- е....  по идее прирост производительности будет раза в 2-3 больше 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)