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


Автор: z-END 17.1.2005, 18:36
Здраствуйте, вопрос такой: например
имеется файл /Data/Music.mp3
хочется сделать так:
при переходе напрямую http://../Data/Muisc.mp3 ссылка не работала, а
через http://../Data/get.php?Music.mp3 все было пучком..
(т.е. открывался диалог Save as...)
Так можно сделать?

Автор: penizillin 17.1.2005, 19:00
да. инструментарий сервера позволяет подобные ограничения. почитайте про .htaccess у apache.

Автор: Irokez 17.1.2005, 19:01
по моему это лучше через настройки сервака сделать в конфигах или .htacсess

Автор: Irokez 17.1.2005, 19:20
надо через конфиг или .htaccess запретить доступ для пользователей ко всем файлам папки, а доступ обеспечить к ним только черех скрипт get.php

Автор: z-END 17.1.2005, 19:32
Irokez а нестрашно что ПХП в сэйф-моде?
Т.е. просто выставить так:
Код

order allow deny
deny from all
allow from get.php

и все заработает?

Автор: Irokez 17.1.2005, 19:42
nJIaKca.spb
если честно я не силен в администрировании, но по-моему это должно сработать, самый легкий способ - проверить на опыте

Автор: Chuck 17.1.2005, 21:41
Предлагаю перелжить все файлы в директорию повыше, куда не доберется браузер!
Т.е. выше директории, где хранится начальный index.html (/home/files/data/www/html/index.html)
А в скрипте для скачивания указывать полный путь скачивания
Код

/home/files/data/music.mp3

И все заработает, как надо smile)
Идея ясна?

Автор: IZ@TOP 18.1.2005, 00:08
Chuck, а не проще просто в конфе апача запретить чтение с сайта *.mp3 файлов? Не помню как, но такая возможность должна быть у Апача. И будет Вам просто ошибка что нет прав на запуск данных файлов. А вообще я всегда думал, вот как можно угадать например название такого файла: Sting - Desert Rose (Mix Any & Key).mp3 лежащего на сервере в непросматриваемой папке, да и вообще сначало папку надо угадать...

Автор: z-END 18.1.2005, 10:01
Цитата(Chuck @ 17.1.2005, 21:41)
Предлагаю перелжить все файлы в директорию повыше, куда не доберется браузер!

предположим юзер №1 действительно получил файл через get.php, но он ведь при скачивании легко узнает реальное местонахождение файла и сможет его передать юзеру №2 который уже сможет получить данный файл минуя get.php
Или я опять туплю? smile

IZ@TOP если запретить чтение файлов *.mp3 то как его вообще можно будет даже через get.php ?!

Автор: Opik 18.1.2005, 10:27
chmod на файл ставь 640

Автор: z-END 18.1.2005, 11:18
Opr а как потом мне доступ к файлу-то получить?

Автор: Opik 18.1.2005, 12:14
nJIaKca.spb
серверу то права будут.

Автор: IZ@TOP 18.1.2005, 13:01
nJIaKca.spb, и ка же юзер №1 узнает местоположение файла??? Если только ты конечно переадресуешь его на него, тогда да, а если get.php будет читать файл и выводить юзеру, тогда он ни чего не узнает кроме пути к файлу get.php smile А вообще сделай как сказал Opr.

Автор: z-END 18.1.2005, 14:19
1 установил 640 как и говорили, а билн вот как получается:
Цитата
fopen("Data.zip", "rb") - Permission denied in /home/.../Data/get.php on line 11

ИМХО скрипт тоже не имеет права читать из файла с такими аттрибутами..
ЗЫ передавать пытался так:
get.php
Код

<?php
$cd = 'Content-Disposition: attachment; filename="data.zip"';
$ct = 'Content-type: application/x-zip-compressed';
$file_date = date("D, d M Y H:i:s T", filemtime("data.zip"));
header ($tt);
header ($ct);
header ($cd);
$f=fopen("data.zip","rb");
while (!feof($f))
  {
   $i = fgetc ($f);
   echo $i;
 }
fclose ($f);
?>

или я передаю неправильно?

Автор: IZ@TOP 18.1.2005, 15:27
Код

<?php
$cd = 'Content-Disposition: attachment; filename="data.zip"';
$ct = 'Content-type: application/x-zip-compressed';
$file_date = date("D, d M Y H:i:s T", filemtime("data.zip"));
header ($tt); // откуда это?
header ($ct);
header ($cd);
$f=fopen("data.zip","rb");
while (!feof($f))
 {
  $i = fgetc ($f); // Если тебе блоками надо читать, то лучше использовать fread или frgets.
  echo $i;
}
fclose ($f);
?>


Если и скрипт не получает прав, то остается два способа: как я говорил, с помощью апача запретить аплоад *.mp3, или как тут кто-то сказал, пихать файлы в директорию которая находится ниже на уровень чем корень сайта.

Автор: z-END 18.1.2005, 15:35
Цитата(IZ @ 18.1.2005, 15:27)
header ($tt); // откуда это?

эт я эксперементировал, и стереть заыбл=) не обращай внимания его нет.

Цитата(IZ @ 18.1.2005, 15:27)
Если тебе блоками надо читать, то лучше использовать fread или frgets

мне надо передать файл (чтобы открылось окошко "Сохранить объект как")
насчет болками или нет это я незнаю smile

Автор: penizillin 18.1.2005, 16:37
а нельзя весь файл одним махом через include() вставить?

Автор: z-END 18.1.2005, 16:40
penizillin это как?

Автор: penizillin 18.1.2005, 18:43
поправлюсь, readfile().

Автор: Chuck 18.1.2005, 21:45
Цитата
предположим юзер №1 действительно получил файл через get.php, но он ведь при скачивании легко узнает реальное местонахождение файла и сможет его передать юзеру №2 который уже сможет получить данный файл минуя get.php
Или я опять туплю?

Тупишь ...
Как он узнает? (Если только ошибки скрипте не будет)
Цитата
ИМХО скрипт тоже не имеет права читать из файла с такими аттрибутами..

Группа файла должна соответствовать группе скрипта (в 90% это группа apache)

penizillin Можно, попробуй!
Цитата
Chuck, а не проще просто в конфе апача запретить чтение с сайта *.mp3 файлов?

Не всегда работает - это раз!
2. Не все хостинги поддерживают .htaccess (мало ли кто, что вздумает smile
IMHO, скрипты должны работать хорошо в настройках по умолчанию!
Цитата
Не помню как, но такая возможность должна быть у Апача. И будет Вам просто ошибка что нет прав на запуск данных файлов.

А смысл?
z-ENDу, я понял, надо путь к файлу скрыть, а не запретить скачивание ....

Автор: z-END 19.1.2005, 09:53
Chuck
1 .htacces на хостинге поддерживается
2
Цитата(Chuck @ 18.1.2005, 21:45)
Тупишь ...
ну вообщето-я и не сомневалсяsmile
ЗЫ а туплю по тому, что сначала я думал просто сделать так:<A href="bla-blabal>файло</A> =)
Цитата(Chuck @ 18.1.2005, 21:45)
я понял, надо путь к файлу скрыть, а не запретить скачивание ....

Мне надо сделать так что-бы файл можно было скачать с сайта только через get.php и никак иначе, а каким способом роли не играет=)
наверное действительно проще всего создать подпапку "FLKEFEMFWEOFEWPOEMR\FIGA1\FIGA2\" и положить туда файл и все-тутsmile

Автор: IZ@TOP 19.1.2005, 11:59
Цитата(z @ 19.1.2005, 10:53)
наверное действительно проще всего создать подпапку "FLKEFEMFWEOFEWPOEMR\FIGA1\FIGA2\" и положить туда файл и все-тут


z-END, как это реализовано на 3mp3.ru smile только там еще такая фича, что качаешь напрямую, но линки потом убиваются сервером. То есть сначало создаются виртуал. каталоги которые ведут к файлам на сервере и по истечении 24 часов они удаляются.

Автор: Chuck 20.1.2005, 11:21
IZ@TOP,
z-END
Вы говорите про сессии или про что-то другое?

z-END
Можно путь к файлу хранить в базе, тогда будет просто www.site.com/index.php?id=123
Т.е. будет у тебя таблица, ты будешь передавать ID, а mysql возвращать путь, ну а скрипт скаивать ...
Уверяю, никто таким образом твой путь не увидит ...

Автор: z-END 23.1.2005, 10:14
Chuck MySQL на хосте отсутсвует, но это можно решить и просто через какой-нить файл типа myfiles.ini где и хранить 123=/mysite/dir1/music.mp3 и т.п.
ЗЫ: почему код который я привел, не поддерживает докачу и не выдает суммарный размер файла?

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