Интересует система , которая выдает ссылку для скачивания каждому пользователю отдельно. И делает невозможным прямое скачивание с сервака. Короче я узнал это называется анитилич. Короче хочу сделать следующее. Пользователь вводит данные. сверяем с данными в mysql. то он переходит на страницу скачки файла,которая действует с этого момента 2 часа. Пожалуйста как запретить прямой доступ к файлу,а выдавать его через php скрипт? Ну с использованием htaccess
На папку с файлами ставишь дени фром лол, а сами файлы для скачки считываешь в бинарном режиме отправляешь заголовки и выводишь в браузер
1)как много это будет хавать ресурсов? 2)Пример можно в студию (а то у меня опыта работы с htaccess вообще нет) вот я нашел тут скрипт,но он печает содержимое страницы. а как сделать чтобы он давал на сохранение? PHP: <?php // Настройки $antiurl = "sup.local"; // Разрешённые сайты (referer). $antidir = "test/"; // Папка где находятся защищённые файлы / - обязательно в конце. $logfile = "log.htm"; // Eсли хотите вести лог удалите // перед строкой. Файл логов (должен быть html или htm и обязательно CHMOD 777. // Логи if (isset($logfile)) { if (!file_exists($logfile)) die("Файл <font color='red'><b>$logfile</b></font> не найден!"); if (!is_writable($logfile)) die("Для файла <font color='red'><b>$logfile</b></font> нужно зделать CHMOD 777!"); $cnr_date = date("l d F H:i:s"); $cnr_counter = $logfile; $cnr_fp = fopen($cnr_counter, "a"); $cnr_hostname = gethostbyaddr($_SERVER['REMOTE_ADDR']); if ($_SERVER['HTTP_REFERER'] == "") { $cnr_ref = "BLOCKED"; } else { $cnr_ref = "<a href=\"" . $_SERVER['HTTP_REFERER'] . "\">" . $_SERVER['HTTP_REFERER'] . "</a>";} $cnr_data = "<font color=\"green\">" . $_SERVER['REMOTE_ADDR'] . "</font> HOST <font color=\"red\">" . $cnr_hostname . "</font> visited on " . $cnr_date . " linked by " . $cnr_ref . " <br>"; fputs($cnr_fp, $cnr_data); fclose($cnr_fp); } // Проверка реферера if (is_numeric($_GET["down"])) { /************НАЧАЛО ФАЙЛОВ***************************************************************************/ // Здесь идут файлы для скачивания if ($_GET["down"] == 1) $filename = "test.rar"; /************КОНЕЦ ФАЙЛОВ***************************************************************************/ //Находим окончание файла $split= explode(".", $filename); $textcount= substr_count($filename, ".")+1; // $ttype =$split[$nextcount]; // Создается ссылка на файл $path = $antidir . $filename ; // Проверка файла есть он или нет if (!file_exists($path)) { echo "Файл '$filename' не существует."; echo $c; exit; } $ftime = date("D, d M Y H:i:s T", filemtime($path)); } // Проверка if (isset($_GET['down']) && isset($filename)) { $fsize = filesize($path); $ftime = date("D, d M Y H:i:s T", filemtime($path)); $fd = @fopen($path, "rb"); if (!$fd){ header ("HTTP/1.0 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, filesize($path)); fclose($fd); if ($range) { header("HTTP/1.1 206 Partial Content"); } else { header("HTTP/1.1 200 OK"); } header("Content-Disposition: attachment; filename=" . basename($path)); 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; } else { echo "Недействительный файл."; echo $c; } exit; ?>
Код не смотрел по 4 кб в цикле читаешь и выводишь, итого расход памяти: 250кб с хуем + 4 кб. order allow,deny deny from all В папку с файлами. Название всех файлов в базе. Скачка download.php?id=xxx, в базе смотрим название файла... Вообщем долго рассказывать, посмотри функции для работы с файловой системой.
дени фром олл.а если нужна скачка то создаёшь php файлик с содержанием <?php header('Content-type: file'); header('Content-Disposition: attachment; filename="$_REQUEST[file]"'); readfile("$_REQUEST['file']"); ?> вызываешь его вот так http://site.ru/script.php?file=index.php предложит скачать файл индекс
код выложил 440hz на форуме php.ru поддерживает докачку ... PHP: <?php /** * @author 440hz * @copyright 2007 */ session_start(); require_once ('includes/config.php'); if (isset($_GET['id'])) {//ID файла в базе if (isset($_SESSION['level']) && $_SESSION['level'] === '2') { // Проверка уровня пользователя //Просим БД дать нам имя файла по его ID $res = $db->mysql_qw('SELECT `name`,`cat` FROM `video` WHERE `id`=?', $_GET['id']) or die(); $fetch = $db->mysql_fetch($res); // отдаваемое файло $filename = 'movie/' . $fetch['cat'] . '/' . $fetch['name']; // есл файла нет if (!file_exists($filename)) { header("HTTP/1.0 404 Not Found"); exit; } // получим размер файла $fsize = filesize($filename); // дата модификации файла для кеширования $ftime = date("D, d M Y H:i:s T", filemtime($filename)); // смещение от начала файла $range = 0; // пробуем открыть $handle = @fopen($filename, "rb"); // если не удалось if (!$handle) { header("HTTP/1.0 403 Forbidden"); exit; } // Если запрашивающий агент поддерживает докачку if ($_SERVER["HTTP_RANGE"]) { $range = $_SERVER["HTTP_RANGE"]; $range = str_replace("bytes=", "", $range); $range = str_replace("-", "", $range); // смещаемся по файлу на нужное смещение if ($range) { fseek($handle, $range); } } // если есть смещение if ($range) { header("HTTP/1.1 206 Partial Content"); } else { header("HTTP/1.1 200 OK"); } header("Content-Disposition: attachment; filename=\"{$filename}\""); header("Last-Modified: {$ftime}"); header("Content-Length: " . ($fsize - $range)); header("Accept-Ranges: bytes"); header("Content-Range: bytes {$range}-" . ($fsize - 1) . "/" . $fsize); // подправляем под IE что б не умничал if (isset($_SERVER['HTTP_USER_AGENT']) and strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE')) Header('Content-Type: application/force-download'); else Header('Content-Type: application/octet-stream'); while (!feof($handle)) { $buf = fread($handle, 512); print ($buf); } fclose($handle); } else { header("HTTP/1.0 403 Forbidden"); exit; } } else { header("HTTP/1.0 403 Forbidden"); exit; } ?>
Code: function downloadFile($filename, $mimetype='application/octet-stream') { if (!file_exists($filename)) die('Файл не найден'); $from=$to=0; $cr=NULL; if (isset($_SERVER['HTTP_RANGE'])) { $range=substr($_SERVER['HTTP_RANGE'], strpos($_SERVER['HTTP_RANGE'], '=')+1); $from=strtok($range, '-'); $to=strtok('/'); if ($to>0) $to++; if ($to) $to-=$from; header('HTTP/1.1 206 Partial Content'); $cr='Content-Range: bytes ' . $from . '-' . (($to)?($to . '/' . $to+1):filesize($filename)); } else header('HTTP/1.1 200 Ok'); $etag=md5($filename); $etag=substr($etag, 0, 8) . '-' . substr($etag, 8, 7) . '-' . substr($etag, 15, 8); header('ETag: "' . $etag . '"'); header('Accept-Ranges: bytes'); header('Content-Length: ' . (filesize($filename)-$to+$from)); if ($cr) header($cr); header('Connection: close'); header('Content-Type: ' . $mimetype); header('Last-Modified: ' . gmdate('r', filemtime($filename))); $f=fopen($filename, 'r'); header('Content-Disposition: attachment; filename="' . basename($filename) . '";'); if ($from) fseek($f, $from, SEEK_SET); if (!isset($to) or empty($to)) { $size=filesize($filename)-$from; } else { $size=$to; } $downloaded=0; while(!feof($f) and !connection_status() and ($downloaded<$size)) { echo fread($f, 512000); $downloaded+=512000; ob_flush(); flush(); } fclose($f); } Функция закачки файла с поддержкой докачки.