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

Форум PHP

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

 

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

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

тема: download-скрипт
 
 автор: mannnz   (11.11.2005 в 19:33)   письмо автору
 
 

Нужен был скрипт, отдающий файлы, с докачкой. Искал, но ничего хорошего не нашел. Пришлось писать самому. Вроде все работает, но кое-что меня смущает.
Вот главная функция:

function download($fname){
  ob_end_clean();

  $fpath = $fname;

  if(!file_exists($fpath)){
    error('404 File Not Found',"Sorry, file not found. 4");
    return false;
  }

  $handle = fopen($fpath, "rb");
  if(!handle){
    error('404 File Not Found',"Sorry, file not found. 5");
    return false;
  }

  if(isset($HTTP_RANGE)){
    header("HTTP/1.1 206 Partial Content");
    $bytes = $HTTP_RANGE;
    $bytes = substr($HTTP_RANGE,6,strlen($HTTP_RANGE)-7);
    $rng = 1;
  }else{
    header("HTTP/1.1 200 Ok");
    $bytes=0;
  }

  $size = filesize($fpath);

  header("Cache-Control: no-store, no-cache, must-revalidate");
  header("Cache-Control: post-check=0, pre-check=0", false);
  header("Pragma: no-cache");
  header("Content-Type: application/force-download");
  header("Content-Transfer-Encoding: binary");
  header("X-Powered-By: MK");
  header("X-Scripts: MKDownloader/1.0");
  header("Content-Transfer-Encoding: binary");

  $length = $size - $bytes;

  if ($rng){
    header("Content-Range: bytes $bytes-$size/$size");
    header("Content-Length: $length");
  }else{
    header("Content-Length: $size");
  }

  header("Content-Disposition: attachment; filename=$fname");

  fseek($handle, $bytes);
  flush();
  fpassthru($handle);
  flush();

  fclose($handle);

  return((connection_status()==0) and !connection_aborted());
}


Я отдаю файл с помощью этой функции:

  fpassthru($handle);

Это правильно?

Или все же следует отдавать с помощью такой конструции? :

  while(!feof($file) and (connection_status()==0)) {
    print(fread($file, 1024*8));
    flush();
  }


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

   
 
 автор: fabik   (12.11.2005 в 00:06)   письмо автору
 
   для: mannnz   (11.11.2005 в 19:33)
 

А зачем идет

print(fread($file, 1024*8));


я делал так просто..

readfile("".$file."");


fpassthru, не люблю я ее, судя по описанию она читает файл и пихает его в память... я представляю себе 200 потоков на файл в 200мб, уж тогда точно его не кто не сможет скачать...

может быть я где-то не прав....


header("Content-Transfer-Encoding: binary");

я бы убрал... у меня была из-за этого проблема со скачкай архивов!!! тем более он повтаряется

   
 
 автор: cheops   (12.11.2005 в 00:09)   письмо автору
 
   для: mannnz   (11.11.2005 в 19:33)
 

Эти 2-3 пользователя вообще скачать ничего не могут или у них возникает 2-3 сбоя на несколько тысяч? Вообще ничего криминального вроде не видно с первого взгляда...

   
 
 автор: mannnz   (12.11.2005 в 00:30)   письмо автору
 
   для: cheops   (12.11.2005 в 00:09)
 

>Эти 2-3 пользователя вообще скачать ничего не могут или у
>них возникает 2-3 сбоя на несколько тысяч? Вообще ничего
>криминального вроде не видно с первого взгляда...

Вот этого я не знаю. Про эти 2-3 сбоя мне чел сказал, которому я поставил этот скрипт. Говорит, что это первые 2-3 сбоя из неск. тыс. закачек. Пользователи, как я понял, попробовали закачать - не получилось, написали письмо ;) . Вот так. Наверно так и оставлю.

2fabik

>fpassthru, не люблю я ее, судя по описанию она читает файл и пихает его в память... я >представляю себе 200 потоков на файл в 200мб, уж тогда точно его не кто не сможет скачать...

Файлы <10 метров. А где ты описание этой функции нашел? Я искал, но ничего вразумительного не нашел.


readfile("".$file."");


А readfile() разве не в память читает? И как докачку сделать, используя readfile() ?


  header("Content-Transfer-Encoding: binary");

Это да... надо удалить один. Но с архивами проблем нет - все правильно качается.

   
 
 автор: cheops   (12.11.2005 в 00:35)   письмо автору
 
   для: mannnz   (12.11.2005 в 00:30)
 

А чем качают не уточняют?

   
 
 автор: mannnz   (13.11.2005 в 00:23)   письмо автору
 
   для: cheops   (12.11.2005 в 00:35)
 

Из браузера. IE 5-6

   
Rambler's Top100
вверх

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