Реклама на сайте Advertise with us

Докачка файла на пхп.

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:



С нами с 17.07.05
Сообщения: 99
Рейтинг: 27

Ссылка на сообщениеДобавлено: 05/09/05 в 22:31       Ответить с цитатойцитата 

Кто подскажет скрипт с поддержкой докачки файлов?
мы тут с товарищем вдвоём помучались, вот этот заставить работать не удалось, файл скачивается не полностью, докачка во флешгет не работает. Где ошибка?!

Код:

  $fn = $_GET['name'];
  $fname = "/".$fn;
  $fhost="files.mysite.com";
  $filename = "http://files.mysite.com/".$fn;

//========== получаем размер и время для файла===========
$x=0;
$fp = fsockopen($fhost, 80, $errno, $errstr, 30) or die("облом");
fputs($fp, "HEAD $fname HTTP/1.0\nHOST: $fhost\n\n");
$x = 0;
while(!feof($fp))
{
    $x.=fgets($fp, 1024);
}
fclose($fp);

preg_match_all("/Content-Length: *[0-9]+/i", $x, $mathes);
$temp = explode(':', $mathes[0][0]);
$FILESIZE = trim($temp[1]);
$fsize = $FILESIZE;

preg_match_all("/Last-Modified: *([^<]*)GMT/i", $x, $tmpdate);
$temp = explode('Last-Modified:', $tmpdate[0][0]);
$ftime = $temp[1];
//=============получили размер файла $fsize и время $ftime============

$fd = @fopen($filename, "rb");
if (!$fd){
  header ("HTTP/1.0 403 Forbidden");
  echo "403";
  exit;
}
// Если запрашивающий агент поддерживает докачку
if ($HTTP_SERVER_VARS["HTTP_RANGE"]) {
  $range = $HTTP_SERVER_VARS["HTTP_RANGE"];
  $range = str_replace("bytes=", "", $range);
  $range = str_replace("-", "", $range);
  if ($range) {fseek($fd, $range);}
}
$content = fread($fd, $fsize);
fclose($fd);
if ($range) {
  header("HTTP/1.1 206 Partial Content");
}
else {
  header("HTTP/1.1 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;

Нестандартный програминг на ПХП тел. 238 145 528

0
 



С нами с 26.02.03
Сообщения: 2366
Рейтинг: 987

Ссылка на сообщениеДобавлено: 06/09/05 в 00:30       Ответить с цитатойцитата 

Вот статья на эту тему: http://xpoint.net.ru/know-how/Perl/GotovyieResheniya/CGI?3

3
 



С нами с 17.07.05
Сообщения: 99
Рейтинг: 27

Ссылка на сообщениеДобавлено: 06/09/05 в 00:40       Ответить с цитатойцитата 


не открывается

Нестандартный програминг на ПХП тел. 238 145 528

0
 



С нами с 26.02.03
Сообщения: 788
Рейтинг: 299

Ссылка на сообщениеДобавлено: 06/09/05 в 01:29       Ответить с цитатойцитата 

Для реализации этого скрипта на Вашей страничке поместите следующую ссылку:

Код:
<A HREF="http://my.server.ru/download.php?name=need_file.rar" target="_top">need_file.rar</A>

для закачиваемого файла. В приведенном примере файлы находятся в подкаталоге download, а через запрос передается только имя файла.

Код:
<?php

  $fn = $HTTP_GET_VARS['name'];
  $filename = './download/' . $fn;

  if(strstr($fn, '/'))
  {
    // небольшая защита от попыток закачки из других каталогов
    header($HTTP_SERVER_VARS["SERVER_PROTOCOL"] . " 403 Forbidden");
    exit;
  }
  if(!file_exists($filename))
  {
    header($HTTP_SERVER_VARS["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($HTTP_SERVER_VARS["SERVER_PROTOCOL"] . " 403 Forbidden");
    exit;
  }
  // Если запрашивающий агент поддерживает докачку
  if($HTTP_SERVER_VARS["HTTP_RANGE"])
  {
    $range = $HTTP_SERVER_VARS["HTTP_RANGE"];
    $range = str_replace("bytes=", "", $range);
    $range = str_replace("-", "", $range);
    if($range)
      fseek($fd, $range);
  }
  $content = fread($fd, $fsize);
  fclose($fd);

  if($range)
    header($HTTP_SERVER_VARS["SERVER_PROTOCOL"] . " 206 Partial Content");
  else
    header($HTTP_SERVER_VARS["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;

?>


При необходимости можно вести протокол закачек.

Обратите внимание!
При открытии файлов функцией fopen более корректным является использование ключа "rb".

===
Взято отсюда

3
 



С нами с 17.07.05
Сообщения: 99
Рейтинг: 27

Ссылка на сообщениеДобавлено: 06/09/05 в 08:09       Ответить с цитатойцитата 

в скрипте используется скачка с другого сервера и объём файлов оч большой, по этому file_exists и filesize ругаются, при замене на другие ф-ции, как показано в моём примере, скрипт перестаёт почему-то работать...

Нестандартный програминг на ПХП тел. 238 145 528

0
 



С нами с 17.07.05
Сообщения: 99
Рейтинг: 27

Ссылка на сообщениеДобавлено: 06/09/05 в 09:52       Ответить с цитатойцитата 

проблема вытаскивания файла решенаicon_smile.gif

Нестандартный програминг на ПХП тел. 238 145 528

0
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »