Upload файлов с поддержкой докачки
Автор: Алимов Рустем
Для реализации этого скрипта на Вашей страничке поместите
следующую ссылку:
<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".
Часть II
Этот скрипт предназначен для закачки удаленных файлов на
Ваш сервер с любого стороннего. Что позволит экономить на
Вашем входящем трафике.
Для выполнения достаточно в браузере набрать следующий
URL:
http://my.server.ru/getfile.php?name=http://need.server.ru/need_path/need_file.ext,
либо передавать значения через форму. В приведенном
скрипте закачиваемые файлы будут помещаться в каталог
download, но можно передавать имя каталога через запрос.
<?php
if(isset($HTTP_GET_VARS['name']))
{
$fn = $HTTP_GET_VARS['name'];
$handle = fopen ($fn, 'rb');
$contents = "";
if(!$handle)
echo 'Error open source file';
else
{
while(!feof($handle))
{
$data = fread($handle, 8192);
$contents .= $data;
}
fclose ($handle);
// './download/' можно заменить, например, на $HTTP_GET_VARS['path']
$handle = fopen ('./download/' . basename($fn), 'wb');
if(!$handle)
echo 'Error create local file';
else
{
fwrite($handle, $contents);
fclose($handle);
echo 'Transfer complete';
}
}
}
?>