Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Скачивание файлов


Автор: a.S.d 5.4.2005, 17:17
Нужно ограничить скачивание файлов с сервера. Допустим посетитель кликает по ссылке чтобы скачать фаил. Скрипт, отвечающий за скачивание файлов, проверяет какое-то условие и либо разрешает скачивать, либо нет. Как сделать, чтобы в случае успеха фаил начал скачиваться (т.е. запустился диалог "загрузка файла")?

Автор: penizillin 5.4.2005, 22:55
например header().

Автор: a.S.d 5.4.2005, 23:06
а header() с какими параметрами?
И при чём он тут? Он же просто задаёт заголовок.

Автор: penizillin 6.4.2005, 15:53
http://www.php.net/header
почитайте, вам понравится.

Автор: a.S.d 8.4.2005, 16:14
сделал следующий скрипт:
пример использования: "download.php?file=asd.rar"
Код

<?
session_start();
session_register("auth");
if($auth==1)  //проверка авторизации
{
header("Content-Disposition: attachment; filename=$file");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($file));
header("Content-type: application/x-download");
@readfile($file);
}
else
echo("Вы не авторизованы");
?>

Так вот всё работает, если не использовать сессию. А в данном случае выдаётся ошибка: "Не удаётся открыть этот узел интернета. Узел не доступен или не найден. Повторите попытку позднее." Почему это происходит?

Автор: a.S.d 9.4.2005, 01:07
Я понял в чём дело, просто session_start() тоже отправляет заголовки smile
Не знаете, каким образом ещё можно проверить авторизацию?

Автор: DarkLight 9.4.2005, 11:59
Да нет - я делаю это именно через Header, и юзаю session_start и проверка авторизацию.
Только зачем в этом скрипте session_register("auth"); - это надо делать когда авторизируеш пользователя

К сожеленю готовый скрипт для скачивания у меня в офисе, если до понедельника ви не написали свой, я вам его напишу

P.S. В документации PHP есть пример для скачивания с header()

Автор: a.S.d 9.4.2005, 16:35
DarkLight
Если не использовать session_register("auth"), то пхп говорит про неизвестную переменную.
Да и запости пожалуйста свой скрипт, а то я уже думал сделать введение пароля при каждом скачивании smile

Автор: DarkLight 10.4.2005, 18:55
a.S.d
А у тебя какая версия PHP?
(Завтра напишу скрипти для ауторизации и скачивания, у меня дома их нет)

Автор: DarkLight 11.4.2005, 11:24
Код

session_start();
if(  !isUserLoggedIn() ){
    header("Location: blank.php");
    exit;
}

function downloadFile($path, $name, $mime){
    if ($fd = fopen ($path, "r")){
        $disposition = "attachment"; // "inline" to view file in browser or "attachment" to download to hard disk
        //$mime = "image/jpeg"; // or whatever the mime type is
        //$name = "foo.jpg"; // file name
        //$path = "/path/to/foo.jpg"; // full path and file name

        if (isset($_SERVER["HTTPS"])) {
            /**
            * We need to set the following headers to make downloads work using IE in HTTPS mode.
            */
            header("Pragma: ");
            header("Cache-Control: ");
            header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
            header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
            header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1
            header("Cache-Control: post-check=0, pre-check=0", false);
        }
        else if ($disposition == "attachment") {
            header("Cache-control: private");
        }
        else {
            header("Cache-Control: no-cache, must-revalidate");
            header("Pragma: no-cache");
        }
        header("Content-Type: $mime");
        header("Content-Disposition:$disposition; filename=\"".trim(htmlentities($name))."\"");
        header("Content-Description: ".trim(htmlentities($name)));
        header("Content-Length: ".(string)(filesize($path)));
        //header("Connection: close");
        while(!feof($fd)) {
            $buffer = fread($fd, 2048);
            print $buffer;
        }
        fclose ($fd);
        unlink($path);
        rmdir(dirname($path));
    }
}


Код

function isUserLoggedIn() {

 if( isset( $_SESSION["user"] ) ) {
    return true;
 }
 return false;

}


Работаеть в PHP 4.3

Автор: a.S.d 11.4.2005, 17:43
DarkLight
Спасибо за скрипт, вроде всё работает, но хотелось бы узнать почему не работает мой скрипт.

Автор: a.S.d 24.4.2005, 22:44
А какой заголовок нужно передать, чтобы скачивался *.rar фаил, а то ослик и опера не узнают application/x-download?

Автор: $дмитрий 24.4.2005, 23:19
для оперы
Код


header("Content-Type: application/x-rar-compressed");
header("Content-Disposition: attachment; filename=" . $file. ";");
header("Accept-Ranges: bytes");
header("Content-Length: " . $size ); //размер файла
readfile($file);


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)