Материалы
[:NetFAQ://]


Поиск

[:NetFAQ://]


Партнеры
Хостинг от Park-Web

www.popularsite.ru
[:NetFAQ://]


Реклама
[:NetFAQ://]


Файловый сервер средствами php. Часть 1

Раздаем файлы средствами php. Часть 1

Небольшая задачка, но может быть полезна в будущем. Чего надо сделать:

  1. Дать возможность пользователю скачивать файлы с сервера.
  2. Одновременно, один пользователь может качать один файл.
  3. Предусмотреть некоторое ограничение скорости, скачивания.
  4. Простота и легкость применения.
  5. Возможность докачки файлов.

Вроде, все. И так приступим. После некоторых размышлений и поиска по просторам Гугла, был найден, практически готовый вариант, реализующий все основные функций нашей задачи. Так как я ленивый, то я зарание благодарю неназванного автора с сайта blog.webmasterschool.ru, за столь полезную информацию.

Для начала приведу полную версию его кода для раздачи файлов через php


// лимит времени выполнения
set_time_limit(0);

// скорость скачивания - 128КБ в сек.
$speed = 1024*128;
// имя файла
$filename = 'doc.pdf';
// размер файла
$filesize = filesize($filename);
// смещение от начала файла
$range = 0;

while( is_already_download() ) {
  // спим пока у пользователя есть активные потоки
  sleep(1);
}

// открываем файл на чтение
$f = fopen($filename, 'rb');

if (isset($_SERVER['HTTP_RANGE'])) { // поддерживается ли докачка
  $range = $_SERVER['HTTP_RANGE'];
  $range = str_replace('bytes=', '', $range);
  $range = str_replace('-', '', $range);
  if ($range) fseek($f, $range);
}
 
// если есть смещение
if ($range) {
  header($_SERVER['SERVER_PROTOCOL'].' 206 Partial Content');
} else {
  header($_SERVER['SERVER_PROTOCOL'].' 200 OK');
}

header( 'Last-Modified: '.date('D, d M Y H:i:s T', filemtime($filename)) );
header('Content-Length: '.($filesize-$range));
header('Accept-Ranges: bytes');
header('Content-Range: bytes '.$range.'-'.($filesize - 1).'/'.$filesize);
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="'.$filename.'"');

while( !feof($f) ) {
  echo fread($f, $speed);
  flush();
  sleep(1); // засыпаем
}

// закрываем файл
fclose($f);

// удаляем информацию о соединении из БД
mysql_query("DELETE FROM `sessions` WHERE `session_ip`='".$_SERVER['REMOTE_ADDR']."' LIMIT 1");

function is_already_download() {
  // проверяем на наличие соединений от пользователя
  $res = mysql_query("SELECT `session_ip` FROM `sessions` WHERE `session_ip`='".$_SERVER['REMOTE_ADDR']."' LIMIT 1");
  if (mysql_num_rows($res)) {
    return true;
  } else { // если запись отсутствует, то добавляем
    mysql_query ("INSERT INTO `sessions` VALUES ('".$_SERVER['REMOTE_ADDR']."')");
    return false;
  }
}
?>
 
 

В чем суть. Имеем некоторый файл, который хотим отдать, имеем юзверя, который хочет его получить. А дальше отдаем одно другому с помощью fread(), паралелльно проверяя не качает ли наш пользователь еще чего. Вроде все. Для начала немного, но в качестве базы этот код в самый раз. В следующей части, мы уберем БД,  добавим просмотр доступных файлов и получим в итоге 3 файла, для автономной работы.


Как всегда премного благодарен сайту http://blog.webmasterschool.ru/ за информацию.



Опубликовано: 2010-02-24 22:03:41 shadx

Комментарии

Оставить комментарий:

Имя:
Почта:
Комментарий:
Что написанно на картинке;)
[:NetFAQ://]

Справочники
[:NetFAQ://]


FreeSoftware
Графика
Аудио&Видео
CD&DVD
Офис
Системные утилиты
Антивирусы
Игры
Разное
[:NetFAQ://]


Статистика


[:NetFAQ://]


FAQ Новости Блог RSS Задать вопрос