Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Скачивание файлов с сервера используя PHP

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3

Открыть новую тему     Написать ответ в эту тему

roma572



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Всё, спасибо. Разобрался

Всего записей: 409 | Зарегистр. 30-03-2002 | Отправлено: 19:35 09-12-2002
hamshen

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот работающий пример.  
Пример урла: http://yourdomaine.net/ndl.php?file=test.zip

Код:
 
// No Direct Links! v0.1
// Copyright (c) 2002 hamshen@mail.ru
 
set_time_limit (0);
 
$workDir = "./";
$allowedHost = "yourdomaine.net";
 
$httpAnswer = array ();
 
if (isset($_GET))
{
$vars = &$_GET;
}
else
{
$vars = &$GLOBALS["HTTP_GET_VARS"];
}
 
if (isset($_SERVER))
{
$server = &$_SERVER;
}
else
{
$server = &$GLOBALS["HTTP_SERVER_VARS"];
}
 
if ( isset($vars["file"]) && $vars["file"]!="" && isAllowed() && file_exists($workDir.$vars["file"]) )
{
 
$workFileName = $file;
$fd = fopen ($workDir.$workFileName, "rb");
$workFileSize = filesize ($workDir.$workFileName);
 
if (isset($server["HTTP_RANGE"]))
{
preg_match ("/bytes=(\d+)-/", $server["HTTP_RANGE"], $m);
$contentSize = $workFileSize - intval($m[1]);
$p1 = $workFileSize-$contentSize;
$p2 = $workFileSize-1;
$p3 = $workFileSize;
fseek ($fd, $p1);
 
header ("HTTP/1.1 206 Partial Content");
header ("Date: " . getGMTDateTime ());
header ("X-Powered-By: PHP/" . phpversion());
header ("X-Script: No Direct Links! v0.1 hamshen@mail.ru");
header ("Expires: Thu, 19 Nov 1981 08:52:00 GMT");
header ("Cache-Control: None");
header ("Pragma: no-cache");
header ("Accept-Ranges: bytes");
header ("Content-Disposition: inline; filename=\"" . $workFileName . "\"");
header ("Content-Range: bytes " . $p1 . "-" . $p2 . "/" . $p3);
header ("Content-Length: " . $contentSize);
header ("Content-Type: application/octet-stream");
header ("Proxy-Connection: close");
header ("");
}
else
{
$contentSize = $workFileSize;
header ("HTTP/1.1 200 OK");
header ("Date: " . getGMTDateTime ());
header ("X-Powered-By: PHP/" . phpversion());
header ("X-Script: No Direct Links! v0.1 hamshen@mail.ru");
header ("Expires: Thu, 19 Nov 1981 08:52:00 GMT");
header ("Cache-Control: None");
header ("Pragma: no-cache");
header ("Accept-Ranges: bytes");
header ("Content-Disposition: inline; filename=\"" . $workFileName . "\"");
header ("Content-Length: " . $contentSize);
header ("Age: 0");
header ("Content-Type: application/octet-stream");
header ("Proxy-Connection: close");
header ("");
}
$contents = fread ($fd, $contentSize);
echo $contents;
fclose ($fd);
}
else
{
header ("HTTP/1.1 404 Object Not Found");
}
 
function getGMTDateTime ()
{
$offset = date("O");
$roffset = "";
if ($offset[0] == "+")
{
$roffset = "-";
}
else
{
$roffset = "+";
}
$roffset .= $offset[1].$offset[2];
return (date ("D, j M Y H:i:s", strtotime ($roffset . " hours ")) . " GMT");
}
 
function isAllowed ()
{
global $server;
global $allowedHost;
 
if ( isset($server["HTTP_REFERER"]) && $server["HTTP_REFERER"]!="" )
{
$url = parse_url ($server["HTTP_REFERER"]);
if ($url["host"] == $allowedHost)
{
return true;
}
return false;
}
return false;
}
 


----------
Хорошие умирают молодыми, но плохие умирают уродливо.

Всего записей: 614 | Зарегистр. 22-04-2002 | Отправлено: 20:52 10-12-2002 | Исправлено: hamshen, 20:56 10-12-2002
VIgor

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Это скрипт для скачивания я так понял?
Я использовал не fread(), а readfile() у народа при скачивании zip файлы битые получались, не в курсе почему?
в таком коде

Код:
 
$range = $HTTP_SERVER_VARS["HTTP_RANGE"];
$range = str_replace("bytes=", "", $range);  
$range = str_replace("-", "", $range);
   
preg_match ("/bytes=(\d+)-/", $server["HTTP_RANGE"], $m);
$contentSize = $s - $range;
$p1 = $s-$contentSize;
 
$p2 = $s-1;
$p3 = $s;
 
header ("HTTP/1.1 206 Partial Content");
//header ("Date: " . getGMTDateTime ()); - ошибка появлялась
header ("X-Powered-By: PHP/" . phpversion());
header ("Expires: Thu, 19 Nov 1981 08:52:00 GMT");
header ("Cache-Control: None");
header ("Pragma: no-cache");
header ("Accept-Ranges: bytes");
header ("Content-Disposition: inline; filename=\"" . $file . "\"");
header ("Content-Type: application/octet-stream");
header ("Content-Range: bytes $range-".($s -1)."/".$s);
header ("Content-Length: " . $contentSize);
header ("Proxy-Connection: close");
 
readfile($url.$file);
 

Всего записей: 38 | Зарегистр. 20-11-2001 | Отправлено: 07:34 11-12-2002
hamshen

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
VIgor
Почитав в мануале про функции readfile и fread, обратив внимание на строки моего кода

Код:
 
if (isset($server["HTTP_RANGE"]))
{  
...
fseek ($fd, $p1);
...
header ("HTTP/1.1 206 Partial Content");
...
}
else
{  
...
header ("HTTP/1.1 200 OK");
...
}  
$contents = fread ($fd, $contentSize);  
 

Ты поймешь, что readfile можно юзать только в первый раз, т.к. во второй и следующие разы тебе уже надо отсылать данные с какой-то позиции, чего не может делать readfile.
 
Добавлено
К тому же не факт что readfile рабоатет идентично

Код:
 
$fd = fopen ("filename", "rb");  
fread ($fd);
 

Прошу обратить внимание на флаг "b", если выкинуть его, то под виндой скрипт будет коряво работать, т.к. там есть различия между текстовым и бинарным режимом.

----------
Хорошие умирают молодыми, но плохие умирают уродливо.

Всего записей: 614 | Зарегистр. 22-04-2002 | Отправлено: 11:30 11-12-2002
Farch



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
hamshen
человеческое спасибо система идёт в Варезник
 
хотя нет... всё таки нужен антилитч..
 
добавил фичу с .htaccess теперь есть антилитч ж)

Всего записей: 3211 | Зарегистр. 25-12-2001 | Отправлено: 15:14 15-12-2002 | Исправлено: Farch, 15:26 15-12-2002
hamshen

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Farch
Антилич - это законченая система, на что мой скриптик и не претендует, хотя и может являться его ядром.


----------
Хорошие умирают молодыми, но плохие умирают уродливо.

Всего записей: 614 | Зарегистр. 22-04-2002 | Отправлено: 16:36 15-12-2002
burewar



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Farch

Цитата:
человеческое спасибо система идёт в Варезник

неужто реально линк скрывает?
Сам попробовал, вроде да, но может только у меня.....
hamshen
Виндовской качалкой - просто открывается в виде txt (html), в итоге получается: что-то типа того....

Код:
readfile("файло.ext");

---------
вопрос> что такое и зачем нужно?>
Цитата:
header ("Content-Disposition: inline; filename=\"" . $workFileName . "\"");

 
Добавлено

Цитата:
Виндовской качалкой - просто открывается в виде txt (html), в итоге получается: что-то типа того....  

>> Может это у меня только!
 
 
Добавлено

Цитата:
Виндовской качалкой - просто открывается в виде txt (html)

ввёл в заблуждение, всё ок

Всего записей: 207 | Зарегистр. 26-12-2001 | Отправлено: 17:40 15-12-2002
hamshen

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
burewar

Цитата:
вопрос> что такое и зачем нужно?>  
Цитата:header ("Content-Disposition: inline; filename="filename.ext");  

Это нужно для того, что бы браузер сохранил файл с именем filename.ext, а не script.php.


----------
Хорошие умирают молодыми, но плохие умирают уродливо.

Всего записей: 614 | Зарегистр. 22-04-2002 | Отправлено: 19:24 15-12-2002
Farch



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
burewar
hamshen
http://forum.ru-board.com/topic.cgi?forum=2&topic=0273#5
не претендует? ну я бы так не сказал гиги

Всего записей: 3211 | Зарегистр. 25-12-2001 | Отправлено: 19:40 15-12-2002
burewar



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ну с этим анти-личём всё ясно, но меня всё ещё "грызут" виртуальные каталоги (просто уснуть не могу временами.......) где б кусок кода (вот именно кусок кода отвечающий за генерацию (т.е создание) и удаление их(виртуальных директорий), а не целый анти-лич) ?

Всего записей: 207 | Зарегистр. 26-12-2001 | Отправлено: 17:40 23-12-2002
hamshen

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
burewar

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

----------
Хорошие умирают молодыми, но плохие умирают уродливо.

Всего записей: 614 | Зарегистр. 22-04-2002 | Отправлено: 19:16 23-12-2002
burewar



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
hamshen
 
Цитата:
А ты уверен они действительно создаются и удаляются? Скорее всего тут какой-то другой алгоритм. Потому что иногда может возникнуть ситуация что кто-то захочет повторно скачать файл. Или же если качать файл в несколько потоков, то последний кусок может скачаться раньше остальных. И что тогда? Надо удлять файл?
 
Честно, я даже не знаю алгоритма, я предположил, но вот ведь охото увидеть этот антилич (кусок его) в виде кода, а не в действии...
Действие онного, как я понял, описал penguinus:
 
Цитата:
Чтобы вы могли действительно полностью контролировать, кто, что, сколько и когда у вас качает, необходимо не давать пользователям прямую ссылку на файл. Вместо этого необходимо написать скрипт, который будет выдавать содержимое файла, который реально лежит в другом, недоступном извне, месте. Перед выдачей файла скрипт должен проверять IP и что вы ещё хотите, чтобы левые люди не могли им воспользоваться. Вот на такой вот скрипт клиент и получает ссылку.  
Это, так сказать, основа антилича, используемого у взора. А вот всё остальное уже особенности конкретной реализации, включая и так интересующие вас ссылочки вида  
http://сами_знаете_кого.нет/filez/9459a1ec7de0cf2083723743c23d5d23/прога.zip  
 
Эти ссылки указывают на самом деле на скрипты, а всё остальное - дело настроек сервера и работы самих скриптов.  

Всего записей: 207 | Зарегистр. 26-12-2001 | Отправлено: 10:55 24-12-2002
hamshen

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
burewar
Ну тогда вполне возможно что еще юзается mod_rewrite.

----------
Хорошие умирают молодыми, но плохие умирают уродливо.

Всего записей: 614 | Зарегистр. 22-04-2002 | Отправлено: 12:30 24-12-2002
burewar



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
mod_rewrite

Вполне возможно..... Наверное так и есть!
Но мне не по себе от  mod_rewrite, не знаю почему.....
Появилась другая идея: http://demonxsoft.host.sk/leech.php?catplace=22&file=gg50.exe
Ну, линк видно?

Всего записей: 207 | Зарегистр. 26-12-2001 | Отправлено: 07:59 31-12-2002
hamshen

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
burewar
Я запутался в чем прикол схемы по которой сперва генерить ссылку, а потом по ссылке отдавать файл?
Нажав по ссылочке

Цитата:
http://demonxsoft.host.sk/leech.php?catplace=22&file=gg50.exe

для меня сгенерировался линк  

Цитата:
http://demonxsoft.host.sk/filez-22/fa7c8f910f603e3741be52b3d381ba1b/gg50.exe

Если я правильно понял, то есть какой-то скрипт, например send.php, вернее даже шаблон скрипта, создается файл ./filez-22/fa7c8f910f603e3741be52b3d381ba1b/gg50.exe, который на самом деле php скрипт, и собирается он из send.php и различных параметров. Я прав?
Но что же я вижу в http заголовке? Все то же самое, а ведь в данном случае оно не нужно

Цитата:
 
Content-Disposition:  
Content-Type: application/octet-stream
 

В чем прикол?

Всего записей: 614 | Зарегистр. 22-04-2002 | Отправлено: 02:56 02-01-2003 | Исправлено: hamshen, 02:58 02-01-2003
burewar



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
В чем прикол?  



Цитата:
Я прав?  
 
Вполне..... или почти....

Цитата:
http://demonxsoft.host.sk/filez-22/fa7c8f910f603e3741be52b3d381ba1b/gg50.exe

Это и есть пхп скрипт, но таких папок, как filez-22 и fa7c8f910f603e3741be52b3d381ba1b - нет. (исползуется ошибка 404 )....
реальный урл: http://demonxsoft.host.sk/22/gg50.exe
А самое главное, что пашет даже на фри хостинге.... host.sk


У меня тут вопрос возник, к вышепредложенному скрипту (вопросы внутри):

Код:
 
// No Direct Links! v0.1
// Copyright (c) 2002 hamshen@mail.ru
 
set_time_limit (0); понятно....
 
$workDir = "./";
$allowedHost = "yourdomaine.net";
 
$httpAnswer = array (); А вот это что? И зачем?
 
if (isset($_GET)) Это я тоже не понял.....
{
$vars = &$_GET;
}
else
{
$vars = &$GLOBALS["HTTP_GET_VARS"];
}
 
if (isset($_SERVER))
{
$server = &$_SERVER;
}
else
{
$server = &$GLOBALS["HTTP_SERVER_VARS"];
}
 
if ( isset($vars["file"]) && $vars["file"]!="" && isAllowed() && file_exists($workDir.$vars["file"]) ) это я понял.....
{
 
$workFileName = $file;
$fd = fopen ($workDir.$workFileName, "rb");
$workFileSize = filesize ($workDir.$workFileName);
 
if (isset($server["HTTP_RANGE"])) А это что? Проверяет серверные переменные...??
{
preg_match ("/bytes=(\d+)-/", $server["HTTP_RANGE"], $m);
$contentSize = $workFileSize - intval($m[1]);
$p1 = $workFileSize-$contentSize;
$p2 = $workFileSize-1;
$p3 = $workFileSize;
fseek ($fd, $p1);
 
header ("HTTP/1.1 206 Partial Content");
header ("Date: " . getGMTDateTime ());
header ("X-Powered-By: PHP/" . phpversion());
header ("X-Script: No Direct Links! v0.1 hamshen@mail.ru");
header ("Expires: Thu, 19 Nov 1981 08:52:00 GMT");
header ("Cache-Control: None");
header ("Pragma: no-cache");
header ("Accept-Ranges: bytes");
header ("Content-Disposition: inline; filename=\"" . $workFileName . "\"");
header ("Content-Range: bytes " . $p1 . "-" . $p2 . "/" . $p3);
header ("Content-Length: " . $contentSize);
header ("Content-Type: application/octet-stream");
header ("Proxy-Connection: close");
header ("");
}
else
{
$contentSize = $workFileSize;
header ("HTTP/1.1 200 OK");
header ("Date: " . getGMTDateTime ());
header ("X-Powered-By: PHP/" . phpversion());
header ("X-Script: No Direct Links! v0.1 hamshen@mail.ru");
header ("Expires: Thu, 19 Nov 1981 08:52:00 GMT");
header ("Cache-Control: None");
header ("Pragma: no-cache");
header ("Accept-Ranges: bytes");
header ("Content-Disposition: inline; filename=\"" . $workFileName . "\"");
header ("Content-Length: " . $contentSize);
header ("Age: 0");
header ("Content-Type: application/octet-stream");
header ("Proxy-Connection: close");
header ("");
}
$contents = fread ($fd, $contentSize);
echo $contents;
fclose ($fd);
}
else
{
header ("HTTP/1.1 404 Object Not Found");
}
 
function getGMTDateTime ()
{
$offset = date("O");
$roffset = "";
if ($offset[0] == "+")
{
$roffset = "-";
}
else
{
$roffset = "+";
}
$roffset .= $offset[1].$offset[2];
return (date ("D, j M Y H:i:s", strtotime ($roffset . " hours ")) . " GMT");
}
 
function isAllowed ()
{
global $server;
global $allowedHost;
 
if ( isset($server["HTTP_REFERER"]) && $server["HTTP_REFERER"]!="" )
{
$url = parse_url ($server["HTTP_REFERER"]);
if ($url["host"] == $allowedHost)
{
return true;
}
return false;
}
return false;
}
 

Всего записей: 207 | Зарегистр. 26-12-2001 | Отправлено: 09:38 02-01-2003
hamshen

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
burewar

Цитата:
Я прав?  
Вполне..... или почти....  

Хорошо, но ты не ответил на мой вопрос:

Цитата:
в чем прикол схемы по которой сперва генерить ссылку, а потом по ссылке отдавать файл?

 
А теперь про скрипт.

Цитата:
$httpAnswer = array (); А вот это что? И зачем?  

Да низачем. Просто я сперва думал http заголовок загонять построчно в массив, а потом выплевывать его из него. Забыл убрать

Цитата:
if (isset($_GET)) Это я тоже не понял.....  

Ну а эти строки нужны для того, чтобы не привязываться с массиву $_GET или $HTTP_GET_VARS, и т.д.
 
Цитата:
if (isset($server["HTTP_RANGE"])) А это что? Проверяет серверные переменные...??  
 
Да, и из кода это видно. Смысл этой проверки в том, что мы определяем как был запрошен файл: с начала или же c определенной позиции.
 
P.S. Вообще-то я его немного переделал. Хочешь посмотреть - пиши в пм.
P.P.S. Ты бы лмшние строки убрал бы, все равно они нафиг не нужны, а читать удобнее будет.

Всего записей: 614 | Зарегистр. 22-04-2002 | Отправлено: 13:19 02-01-2003 | Исправлено: hamshen, 13:22 02-01-2003
burewar



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
P.S. Вообще-то я его немного переделал. Хочешь посмотреть - пиши в пм.  

OK... см ПМ.

Цитата:
Хорошо, но ты не ответил на мой вопрос

Там же.....

Всего записей: 207 | Зарегистр. 26-12-2001 | Отправлено: 16:34 02-01-2003
SoftICE



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
У меня почему то скрипт hamshena не работает..
 
Файлы которые скачиваются, не работают...
 
Причем то что скачивается, смещен на 2 байта =(
Как исправить?

Всего записей: 1065 | Зарегистр. 10-01-2003 | Отправлено: 14:18 05-04-2004
hamshen

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SoftICE
Скорее всего потому что где-то в скрипте у тебя выплеввываются эти самые два байта.
Посмотри еще этот топик - http://forum.ru-board.com/topic.cgi?forum=24&topic=2994

----------
Хорошие умирают молодыми, но плохие умирают уродливо.

Всего записей: 614 | Зарегистр. 22-04-2002 | Отправлено: 15:16 05-04-2004 | Исправлено: hamshen, 15:17 05-04-2004
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3

Компьютерный форум Ru.Board » Интернет » Web-программирование » Скачивание файлов с сервера используя PHP


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

LiteCoin: LgY72v35StJhV2xbt8CpxbQ9gFY6jwZ67r

Рейтинг.ru