Запрет на скачивание файла

Larson

Новичок
Запрет на скачивание файла

Привет!
Есть вордивский файл file.doc, его можно скачивать. Можно ли сделать как нибудь, чтобы этот файл могли скачивать только зарегистрированные пользователи. Т.е. чел заходит на сайт, регистрируется, лазиет по сайту в разделе для зарегистрированных, нажимает на ссылку 'скачать' и ему отдается этот файл. Но ведь если какой-нибудь анрегистеред наберед в строке браузера путь к файлу, то он тоже может его скачать? Или нет?
 

f1

formula 1
файлы ложи в папки не доступные из web
и отдавай юзерам их через скрипт
проверяя в нем авторизацию
 

Voxus

founder (Старожил PHPCluba)
угу

либо средствами апачи чрез basic authentication
 

Larson

Новичок
Автор оригинала: f1
файлы ложи в папки не доступные из web
и отдавай юзерам их через скрипт
проверяя в нем авторизацию
Что-то я смутно представляю как это будет в IIS. Путь к файлу какой писать - относительный или абсолютный? А если относительный, то относительно чего?
 

Chese

Guest
Что-то я смутно представляю как это будет в IIS. Путь к файлу какой писать - относительный или абсолютный? А если относительный, то относительно чего?
Относительно твоего начальника :)

Файлы сайта у тебя лежат в папке c:\webroot
Так вот доковский документ ложи в папку c:\webdocs которая не тоступна через WEB.

а ссылка на документ будет такой http://mysite.ru/doc.php
содержание doc.php взято из соседнего топика :)
PHP:
<?php
$filename="c:\\webdocs\\file.doc";
header("Accept-Ranges: bytes");
header("Content-Length: ".filesize($filename));
header("Content-Type: x-application/octet-stream");
header("Content-Disposition: attachment; filename=\"$filename\"");

$fp=fopen($filename,"rb");
if ($fp) fpassthru($fp);
flush();
?>
 

Chese

Guest
Да забыл сказать в doc.php проверяй зарегистрирован пользователь или нет.
 

Larson

Новичок
Блин.
Беру вышенаписсанный пример, записываю под названием test.php, запускаю. А он как-то глючно работает - вылетает окно 'загрузка файла', а там такая строчка: 'загружается файл: test.php c localhost'.
Почему test.php, а не тот файл, который указан в $filename?
Иду дальше, нажимаю ОК, выбираю каталог, ОК - файл переписывается тот, который в $filename, НО к нему в конец добавляется несколько пробелов. Откуда они берутся?

Кто-нибудь знает как это исправить?
 

Larson

Новичок
И еще, если закомментировать хидеры, то файл нормально читается и выводится в браузер.
 

Chese

Guest
<?php
$filename="file.doc";
$filepath="c:\webdocs\";
header("Content-Type: x-application/octet-stream");
header("Content-Disposition: attachment; filename=\"$filename\"");
header("Content-Length: ".(string)(filesize($filepath.$filename)));
$fp=fopen($filepath.$filename,"r");
fpassthru($fp);
?>

А так?
 

Larson

Новичок
Автор оригинала: Chese
А так?
А так тоже не то. Т.е. в браузер он нормально выводится, а вот окно с предложением сохранить файл не выводится.

ЗЫ: Ну что делать-то????????:( :eek:
 

Mammoth

Guest
Попробуй написать так:

header('Content-Disposition: filename=\"$filename\"');
 

grayangel

равновесник
Зайди телнетом на свой вебсервер и запроси файл вручную и посмотри, какие он выдает заголовки. Например, я создал файлик test.doc с одной строкой its a test и сделал:

telnet xxx.xxx.xxx.xxx 80
GET http://www.blabla.ru/test.doc HTTP/1.0

HTTP/1.0 200 OK
Date: Tue, 24 Sep 2002 08:03:43 GMT
Server: Apache/1.3.26 (Unix) PHP/4.2.3 mod_ssl/2.8.10 OpenSSL/0.9.6g
Cache-Control: max-age=86400
Expires: Wed, 25 Sep 2002 08:03:43 GMT
Last-Modified: Tue, 24 Sep 2002 08:02:14 GMT
ETag: "e9905-b-3d901c06"
Accept-Ranges: bytes
Content-Length: 11
Content-Type: application/msword
X-Cache: MISS from proxy.blabla.ru
Proxy-Connection: close

its a test

Ентер нажимать два раза после строки GET...
 

Alik

Guest
To Larson.
В теме СОХРАНИТЬ РИСУНОК я подымал этот вопрос.
Посмотри http://phpclub.net/talk/showthread.php?s=&threadid=23780&rand=16 возможно решишь свою проблу. По крайней мере рисунки и архивы скачиваются, надо только поменять расширение.
 

Ямерт

The Old One
Посмотри вариант хэдэров здесь: http://phpclub.net/talk/showthread.php?s=&threadid=22989&rand=12

В клубе уже неоднократно обсуждалась тема вызывания диалога сохранения.

ЗЫ: файл, который содержит этот код, вызывается как .../download.php/<filename>, чтобы не было проблем с именем сохраняемого файла.
 

Larson

Новичок
Ок.
Сделал так.
PHP:
$files = "app.zip";
$files_folder = "e:\\php\\";
$size = $files_folder . $files;
header("Content-Type: application/download; name=$files");
header("Content-Lenght:".filesize($size));
header("Content-Disposition: filename=$files");

$f = fopen($size, "rb");
$s = fread($f, filesize($size));
fclose($f);
echo $s;
Все заработало, протестировал под ИЕ, файл даунлодится, все имена совпадают, но почему-то в конец файла дописываются четыре лишних байта, имхо перевод строки.
Хотя zip'ы нормально распаковываются, несмотря на эти лишние байты.
Кто-нибудь знает откуда они беруться, и как это лечить?
 
Сверху