У кого есть пример докачкы
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)
О, Шифт, спасибо. Как раз это и интересовало
тоже файлы без расширения храню в уникстайм.
Завтра проверю включена поддержка шелл комманд или нет
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