У кого есть пример докачкы

1. Удаленный (27.12.2009 / 06:27)
Как организовать отдачу файла с докачкой?

2. Удаленный (27.12.2009 / 06:55)
Тоисть хочу узнать как работает чтобы ешё организовать импорт сибе на сервер с докачкой ато оперативкы 50mb а фильм 700mb

3. Tony V (27.12.2009 / 07:53)
Докачка должна поддерживаться веб сервером. Скриптом её не сделать. Обращайся в свою хостинг компанию

4. Удаленный (27.12.2009 / 10:08)
3, Открою тибе маленькой сокрет ты не прав. Поддерживается я знаю ето на все 100%

5. Вантуз-мен (27.12.2009 / 22:04)
где-то был у меня скрипт, не могу найти, помню что там проверяется поддерживает ли браузер докачку RANGE и сам скрипт

6. Lugaro (27.12.2009 / 22:13)
<?php
function db_file($fname, $name, $mimetype = 'application/octet-stream')
{
    if (!file_exists($fname)) die('Файл не найден');
$fsize=filesize($fname);
$fdown= $fname;
// Установлена или нет переменная HTTP_RANGE
if (getenv('HTTP_RANGE')=="") {
  // Читать и отдавать файл от самого начала
  $f=fopen($fdown, 'r');
  header("HTTP/1.1 200 OK");
  header("Connection: close");
  header("Content-Type: ".$mimetype."");
  header("Accept-Ranges: bytes");
  header("Content-Disposition: Attachment; filename=".$name);
  header("Content-Length: ".$fsize);
  while (!feof($f)) {
    if (connection_aborted()) {
      fclose($f);
      break;
    }
    echo fread($f, 512000);
    sleep(1);
  }
  fclose($f);
}
else {
  // Получить значение переменной HTTP_RANGE
  preg_match ("/bytes=(\d+)-/", getenv('HTTP_RANGE'), $m);
  $csize=$fsize-$m[1];  // Размер фрагмента
  $p1=$fsize-$csize;    // Позиция, с которой начинать чтение файла
  $p2=$fsize-1;         // Конец фрагмента
  // Установить позицию чтения в файле
  $f=fopen($fdown, 'r');
  fseek ($f, $p1);
  header("HTTP/1.1 206 Partial Content");
  header("Connection: close");
  header("Content-Type: ".$mimetype."");
  header("Accept-Ranges: bytes");
  header("Content-Disposition: Attachment; filename=".$name);
  header("Content-Range: bytes ".$p1."-".$p2."/".$fsize);
  header("Content-Length: ".$csize);
  while (!feof($f)) {
    if (connection_aborted()) {
      fclose($f);
      break;
    }
    echo fread($f, 512000);
    sleep(1);
  }
  fclose($f);
}}


7. Станислав (27.12.2009 / 22:16)
http://php.su/articles/?cat=examples&page=018

8. Удаленный (27.12.2009 / 22:35)
Спасибо щас буду куралесить

9. Tony V (27.12.2009 / 23:46)
Ну даже если я не прав, что такого скрипта не существует, но зачем занимать php на такую элементарнейшую вещь, как скачивание файла?

10. Удаленный (28.12.2009 / 01:04)
Я отвечю тибе:
1) Если файлы лежат в базе,
2) Если надо проследить за популярностю файла.
3) Если файл разрешается скачивать с ограниченным доступом.
4) Если надо проследить чтобы не накручивали рейтинг.
И ещё много преимушеств.

11. Саня (28.12.2009 / 01:26)
9,Обменники по типу депосита,рапиды юзают подобные фишки

12. Удаленный (28.12.2009 / 02:02)
Чёта не хочет никак вставил внизу db_file('f.zip','file.zip');
перехожу качает нажимаю паузу продолжить - заново качает))
мож у меня чет с браузером.
Попробуйте ктонить
[Вот файл]>|<[скрипт]

13. Lugaro (28.12.2009 / 03:24)
12. TLENS, пробивал твой пример, не работает, а вот у себя в обменнике пробивал, все пашет http://wapnew.ru/up/
ЗЫ ссылка на скрипт у тебя битая

14. Удаленный (28.12.2009 / 03:55)
У тибя mp3 хотел скачать ниче не получилось опера глучит узбек тоже

15. Удаленный (28.12.2009 / 04:20)
Еще вопрос ето будет отдавать гигабайтные файлы?

16. Lugaro (28.12.2009 / 04:51)
14. TLENS, Не знаю, у меня норм качает что с тела что с пк, но уже говорили что бывает проблема при скачке, пока просто не доходили руки разобраться в чем проблема

17. Удаленный (28.12.2009 / 06:00)
Кстати мод. чтения говоря лутче rb

18. Удаленный (28.12.2009 / 06:20)
7. SNELS, Спасибо работает без проблем +

19. Удаленный (28.12.2009 / 06:20)
<?php
  $fn = $HTTP_GET_VARS['name'];
  $filename = 'f.zip';
  $fn='f.zip';/*Тестовая пер.*/
  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;
?>


20. Удаленный (28.12.2009 / 07:10)
Есть у когото есть идея импорта на сервер с докачкой

21. Удаленный (28.12.2009 / 15:44)
Вощем если сайт отдает заголовок Acept-ranges: bites
Ето значет поддерживает?
И что надо передавать в заголовках Ето?
header('Acept-ranges: bites=чё_здесь -и_здесь?');
Чё где писать чтобы качат По 20000000 bites

22. Neformat (28.12.2009 / 16:29)
Автор, я хренею с вашей манеры ставить вопросы, а еще больше с вашей орфографии.

23. Удаленный (28.12.2009 / 17:16)
Я за тибя рад

24. ктулху (28.12.2009 / 17:36)
21, я точно незнаю, но догадываюсь что это начало и конец в байтах. т.е. чтоб с начала качать то надо 0-(кол-во байт в файле), ну и следовательно если качаешь частями то 0 меняешь на начальную точку

25. Удаленный (28.12.2009 / 19:58)
Вощем щас погляжу на гугле че там потом буду тестить

26. Удаленный (28.12.2009 / 20:19)
Нашол интиресную статейку по работе с RANGES щас выложу

27. Удаленный (28.12.2009 / 20:26)
Байтовые диапазоны
----------------------------
При работе с фрагментами содержимого в
специальных заголовках используются байтовые
диапазоны (англ. byte ranges).
В них можно
указать как один фрагмент, так и несколько
разделяя их запятыми «,».
Диапазоны применяются
в заголовках Range и Content-Range. В заголовке
Accept-Ranges перечисляются только единицы
измерения.
----------------------------
В байтовых диапазонах обязательно в начале
указываются название единиц измерения за
которым следует символ «=».
В настоящий момент
кроме единиц bytes никакие другие не
применяются.
За символом «=» располагаются
сами диапазоны.
Каждый из них является
разделённой дефисом «-» парой натуральных чисел
или нуля.
Первый элемент указывает начальный
байт, а второй - конечный.
Нумерация в диапазонах
начинается с нуля.
----------------------------
Начальный или конечный байт может быть не указан.
При отсутствии последнего байта считается что
речь идёт о фрагменте от начального байта до
конца содержимого. Если отсутствует начало, то
номер конечного байта воспринимается как
количество запрашиваемых байт от конца
содержимого.
----------------------------
Если первый байт больше чем последний, то
диапазон считается неправильным. Диапазоны с
недопустимыми значениями игнорируются. Если
первый байт выходит за пределы объёма ресурса, то
диапазон игнорируется. Если последний байт
выходит за пределы содержимого, то диапазон
обрезается до конца.
----------------------------
Блок байтовых диапазонов считается выполнимым
если в нём содержится хотя бы один доступный
диапазон. Если же все диапазоны некорректны или
выходят за пределы объёма ресурса, то серверу
следует вернуть сообщение со статусом 416
(Requested range not satisfiable).
----------------------------

28. Удаленный (28.12.2009 / 20:34)
Примеры (весь объём ресурса - 5000 байт):
----------------------------
bytes=0-255 - фрагмент от 0-го до 255-го байта
включительно.
----------------------------
bytes=42-42 - запрос одного 42-ого байта.
----------------------------
bytes=4000-7499,1000-2999 - два фрагмента. Так как
первый выходит за пределы, то он интерпретируется
как «4000-4999».
----------------------------
bytes=3000-,6000-8055 - первый интерпретируется
как «3000-4999», а второй игнорируется.
----------------------------
bytes=-400,-9000 - последние 400 байт (от 4600 до
4999), а второй подгоняется под рамки
содержимого (от 0 до 4999) обозначая как
фрагмент весь объём.
----------------------------
bytes=500-799,600-1023,800-849 - при пересечениях
диапазоны могут объединяться в один (от 500 до
1023).
----------------------------
Вот собственно и все, щас буду куралесить

29. Удаленный (28.12.2009 / 21:13)
Кто знает как узнать скорость отдачи сервера. И как ограничить ето в хтачисе ставить?

30. Удаленный (20.01.2010 / 13:37)
Посуте дела он не отдаст файл выше веса оперативки есть ли альтернатива етому? Например думал отдавать по 10 мб потом с помощу fseek() подганять под ранге.
Но при скачке например фильма 700 мб ето не выход

31. Lugaro (10.04.2010 / 19:48)
Сейчас появилась потребность в этой функции, начал искать оптимальный вариант, собственно в 7 посте вариант хороший только большие файлы не выдать, оперативки не хватает, начал разбираться в чем проблема в моем коде из 7 поста, так вот, пропустил функцию flush() того и глючило, браузер ждал конца выполнения скрипта, в циклах после sleep(1); нужно поставить flush(); и все будет отлично, ну а так как мне кажется вариант оптимальный, оперативку не так грузит, можно по скорости ограничения ставить, ну а чтоб все телефоны нормально принимали файл, нужен Rewrite и нормальный мим тип, потому что application/octet-stream некоторые телефоны принимают как не известный формат

32. ramzes (10.04.2010 / 21:30)
Тупой вопрос, если просто отдавать файл скриптом, сразу весь, скажем 5мб, это оч сильно грузит сервер?
// браузер любого нормального телефона, даже очень простого, определяет формат файла при скачивании, по содержимому.
Если закачка пошла то 99% что определит сам, даже если заголовок октет-стрим и нет расширения у файла.
Сам вчера своим кирпичем проверял))
file.EXT
size: 6112 bite
type: image/jpeg
recerved: no.
Скачивал по такому адресу: site.ru/file/1/

33. Lugaro (11.04.2010 / 00:07)
32. ramzes, ну не знаю, я тестил с какой то нокии, когда скачиваешь она не определяла, а с нормальным мимом норм
>Скачивал по такому адресу: site.ru/file/1/
Опять же не у всех так, опера мини мод вообще сохранит его как 1, я вот у себя файлы храню в отдельной папки с именем 454555.up а в базе храню реальное имя и потом реврейтом подставляю, выходит чтото типа http://test1.ru/forum/file/8/fcaf81f87580aa1daae1c88fe428fe80/793px-100_Yen_lighter.JPG = http://test1.ru/forum/file/ид файла/сессия/793px-100_Yen_lighter.JPG и норм всё качает, плюс выдачи файла скриптом в том что не нужно заморачиватся при опланде с расширениями, а так любой файл можно грузить и не парится, ну и канеш ещё один плюс это антилич

34. ramzes (11.04.2010 / 01:01)
Можно в принципе и выдавать имя в урл, правда я уже с родных арбузов 7 разных мобильных попробывал.
Есть проблемы с именем файла, точнее не проблема, а просто сохраняет с именем file а не из заголовка.
Но тип файла определил все и открыли картинку без проблем))
во, еще вопрос, как определить с каким заголовком миме типа файл выдавать что бы безопасно и не октет-стрим? Раньше просто не пользовался такой шнягой..

35. Lugaro (11.04.2010 / 01:25)
Я думаю файлы с мимом text/* лучше отдавать как октет-стрим чтоб xss небыло, ну и всё вроде бы

36. Удаленный (13.04.2010 / 01:07)
Только никто не взал во мнимание функцию set_time_limit() которую как правило жмут хостеры. А без нее кроме картинок больше ничего не отдаш. Разве что маленький вес.

37. Lugaro (13.04.2010 / 02:25)
36. TLENSi, почему не кто не взял во внимания, просто она не стоит такого внимания, на нормальных хостах не кто не чего не жмет

38. ктулху (13.04.2010 / 02:30)
На тему определения типа файла, в линуксе есть такая хорошая утилитка "file".
Использовать можно так: $type=shell_exec("file -i /home...(путь к файлу)");
$ file --mime-type screenshot_001.png 
screenshot_001.png: image/png
Вот примерно это он выдаст (вторая строка). Минус данного метода в том что 99% говнохостенков боятся за свою безопасность, и вместо реального решения проблемы просто запрещают очень много функций (shell_exec и exec в том числе)
Выбирайте правильный хостинг если реально хотите использовать нормальные методы =)
ЗЫ, тип определяется не по расширению, сам юзаю этот способ, файлы храню в виде 10 цифр (time unix)

39. ramzes (13.04.2010 / 03:06)
О, Шифт, спасибо. Как раз это и интересовалоsmile тоже файлы без расширения храню в уникстайм.
Завтра проверю включена поддержка шелл комманд или нетsmile

40. ктулху (13.04.2010 / 03:06)
Блин, =)
не $type=shell_exec("file -i /home...(путь к файлу)");
а
$type=shell_exec("file --mime-type /home...(путь к файлу)");
39, всегда пожалуйста =)

URL: https://visavi.net/topics/4271