Все ленты — последние статьи

Upload файлов с поддержкой докачки

Upload файлов с поддержкой докачки

Автор: Алимов Рустем

 

<?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

Этот скрипт предназначен для закачки удаленных файлов на Ваш сервер с любого стороннего. Что позволит экономить на Вашем входящем трафике.

http://my.server.ru/getfile.php?name=http://need.server.ru/need_path/need_file.ext,

<?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';
}
}
}
?>