Антилич скрипт(скрытие прямых ссылок на файлы) и большие файлы

Статус
В этой теме нельзя размещать новые ответы.

G-Null

Местный житель
Регистрация
6 Сен 2007
Сообщения
178
Реакции
21
Есть простой скрипт благодаря которому можно отдавать файлы(не паля прямые линки на файлы) и осуществлять докачку файла(в случае дисконекта, например:(
PHP:
$fname=$_GET['fname']; // имя файла

$fsize = filesize('secret_data/'.$fname); // secret_data папка в которой лежат файлы
$fdown = 'secret_data/'.$fname;

// Установлена или нет переменная HTTP_RANGE
if (getenv('HTTP_RANGE') == "") {
  // Читать и отдавать файл от самого начала
  $f = fopen($fdown, 'r');

  header("HTTP/1.1 200 OK");
  header("Connection: close");
  header("Content-Type: application/octet-stream");
  header("Accept-Ranges: bytes");
  header("Content-Disposition: Attachment; filename=".$fname);
  header("Content-Length: ".$fsize); 


  echo fread($f, $fsize);

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

  header("HTTP/1.1 206 Partial Content");
  header("Connection: close");
  header("Content-Type: application/octet-stream");
  header("Accept-Ranges: bytes");
  header("Content-Disposition: Attachment; filename=".$fname);
  header("Content-Range: bytes ".$p1."-".$p2."/".$fsize);
  header("Content-Length: ".$csize);

  fseek ($f, $p1);
  echo fread($f, $csize);

  fclose($f);

Будет ли нормально работать такой метод для файлов размером по 1-2 гигибайта
 
Нормально — нет. Задачка на дом: узнать, почему?
И читайте вот это — Для просмотра ссылки Войди или Зарегистрируйся, там скрыт ответ на вопрос.
 
Есть простой скрипт благодаря которому можно отдавать файлы(не паля прямые линки на файлы) и осуществлять докачку файла(в случае дисконекта, например:(
А для какого веса работает этот код и где его нужно прописать?)
 
  • Заблокирован
  • #4
host/script.php?fname=../../../../../../../etc/passwd
:bad:
 
Поставь nginx, там есть модуль для сокрытия адреса файла. Кстати для передачи больших файлов этот сервер само то.
 
Отдавать файл через php - конечно рак мозга, но зачастую это оказывается единственный выход. О чем надо помнить:

set_time_limit() - не 0, а какое-нибудь большое число, например сутки. Если у тебя за сутки не стянули файл - нафиг таких диалапщиков.

fread() - надо читать не весь файл, а кусками, как в примере у admLoki. Иначе на больших файлах будет вылетать с Memory allocation error.

не забывать делать flush() после каждого отданного кусочка. А то тоже вылетает. connection_status() и connection_aborted() тут в принципе до жопы, можно без них.

ну и еще, на чем я лично спотыкался, это правильно высчитывать Filesize, Filepos и HTTP-Range. Одно от нуля считается, второе от единицы, короче легко запутаться. Но ты, если будешь готовый код копировать, наверное тут не заметишь проблем. )

Ну и напоследок - всегда можно обойтись самим апачем (если уж нет прав поставить nginx), просто дописывая ему в RewriteMap какой-нибудь уникальный урл для каждого файла, и раз в сутки чистя старые урлы, чтобы ссылки не становились перманентными. Плюс mod_rewrite позволяет ограничить доступ к этому урлу по ip и по куке - т.е. ты можешь выдавать юзеру сгенеренную ссылку, которая действует только для него и еще и ограничена по времени. Этот вариант намного лучше, т.к раздачей занимается сам апач (лучше бы nginx конечно, но раз нету..), но есть и минус - нельзя ограничивать скорость скачки.
 
скажем а как работает депозит или лилбит ?
докачка хорошо бы но можно и без нее.
 
скажем а как работает депозит или лилбит ?
докачка хорошо бы но можно и без нее.
Все нормальные сайты юзают nginx или самописные балансировщики. Написать самому на сях веб-сервер чтоб отдавал статику - не так уж и сложно, а выиграть на этом можно каких-нибудь 200-300 дополнительных соединений по сравнению с nginx, так что когда масштабы соответствующие, то есть смысл и сэкономить.

"Отдавалка через php-скрипт", при условии что php запущен как модуль апача, вряд ли потянет больше 600 параллельных скачиваний на стандартном серваке. Если как cgi - и того меньше.
 
ещё есть варианты:
1. копировать файл :)
2. создавать линк на файл (ln)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху