Forum Webscript.Ru

Программирование => PHP => Тема начата: new_coder от 23 Января 2007, 12:43:18

Название: организация скачивания файлов с сервера
Отправлено: new_coder от 23 Января 2007, 12:43:18
Такая задача.

1. есть файл на сервере.
2. есть набор клиентов (достоверно определяемые по email)

Необходимо выдовать временные пароли и ссылки на скачивание.

Подскажите общие принцыпы!

1. как на сервере хранить файл что б доступ был только с временных ссылок? (доступна только папка htdocs)
2. как создаются временные ссылки?
3. когда производть аутентификацию по паролю?
Название: организация скачивания файлов с сервера
Отправлено: CGVictor от 23 Января 2007, 15:47:26
new_coder
Совет номер ноль: поищи по форуму, уже много-много раз обсуждали.

3. Авторизацию проводищь когда тебе удобно. Главное, чтобы при запросе файла ты мог определить кто пользователь, собссно, такой. Session cookie для этого подходит.

2. Временные ссылки создаются случайным образом и заносятся в базу, в записи: идентификатор, время создания ссылки, файл оригинала, пользователь (если нужен).
Когда пользователь обращается за файлом, он так или иначе должен передать идентификатор временной ссылки твоему скрипту.
Что делает скрипт: смотрит, есть ли у него в базе такая ссылка, не истекло ли время, какие-то другие параметры. Если всё хорошо - отдает файл.

1. В папке с файлами положить .htaccess с чем-то вроде Deny from all. Тогда доступ будет только из твоих скриптов.

Неплохо бы еще заморочиться с content-range (чтобы пользователь мог "докачивать" файл), но это следующий этап.
Название: организация скачивания файлов с сервера
Отправлено: new_coder от 25 Января 2007, 10:41:01
спасибо

(поиском конечно пользовался)
Название: организация скачивания файлов с сервера
Отправлено: new_coder от 26 Января 2007, 10:19:03
такой вариант кода:


$HTML_Content = "


Сервер обновлений



";


if(isset($_GET[\'id\']) && isset($_GET[\'name\']))
{
$pass = CutBack($_GET[\'id\']);
$name = CutBack($_GET[\'name\']);
if( !($pass == \'\') && (!$name == \'\'))
{
$str = \'SELECT * FROM testload WHERE pass = \\\'\'.md5($pass).\'\\\'\';
$sql_sel_res = mysql_query($str);
if(!$sql_sel_res === false)
{
$res_sel = mysql_fetch_array($sql_sel_res,MYSQL_ASSOC);
if($res_sel[\'user_id\'] === $name)
{
$str = \'UPDATE testload SET count = count - 1 WHERE user_id = \\\'\'.$res_sel[\'user_id\'].\'\\\'\';
$sql_upd_res = mysql_query($str);
if($res_sel[\'count\'] < 1)
{
$str = \'DELETE FROM testload WHERE  user_id = \\\'\'.$res_sel[\'user_id\'].\'\\\'\';
mysql_query($str);
}
$path = \'sait\\update\\\';
if(!file_exists($path.$res_sel[\'file\']))
{
$HTML_Content.=\'Файла нет\';
}
$hfile = fopen($path.$res_sel[\'file\'],"rb");
if($hfile === false)
{
$HTML_Content.=\'Файл не открылся\';
}
else
{
header("Content-Type: application/force-download\\r\\n");
header("Content-Transfer-Encoding: binary\\r\\n");
header("Content-Length: ".filesize($path.$res_sel[\'file\']));
header("Content-Disposition: attachment; filename=".$res_sel[\'file\']."\\r\\n");
readfile($path.$res_sel[\'file\']);
die("скачал");
}
}
else
{
$HTML_Content.="Данные неверные";
}
}
else
{
$HTML_Content.="Пароль неверный";
}
}
}
else
{
$HTML_Content.="нет данных";
}

$HTML_Content.="";

echo $HTML_Content;



ваше мнение?
Название: организация скачивания файлов с сервера
Отправлено: CGVictor от 26 Января 2007, 13:01:23
new_coder
1. Запрос может отработать (true) но не вернуть значений. if(mysql_num_rows=1)

2. И где здесь временные ссылки? Я вижу только счетчик допустимого количества скачиваний файла для пользователя. Хотя возможно для твоей задачи большего и не надо.
Название: организация скачивания файлов с сервера
Отправлено: Макс от 26 Января 2007, 13:20:38
по мелочам:
- обязательно надо проверять результаты, не было ли ошибок при выполнении запросов (особенно Insert, Delete).
- для проверки доступности файла  - лучше is_readable
- убери die("скачал");  иначе это слово тоже попадет в файл клиенту :)
Название: организация скачивания файлов с сервера
Отправлено: CGVictor от 26 Января 2007, 13:35:47
Макс
* die не попадет, у него content-length правильно дописывается
Название: организация скачивания файлов с сервера
Отправлено: Макс от 26 Января 2007, 13:49:44
CGVictor
да, был не прав
Название: организация скачивания файлов с сервера
Отправлено: new_coder от 26 Января 2007, 14:39:12
временная ссылка это линк на этот скрипт

вроде: _http://download.php?name=\'123\'&pass=\'7sdfv90bv80v0sv9\'

или обычно это что-то другое?
Название: организация скачивания файлов с сервера
Отправлено: CGVictor от 26 Января 2007, 18:17:06
new_coder
* Передавать пароль get-ом не слишком правильно.

Это обычно host.tld/script?7283afd02138ff80eba12832.
"7283afd02138ff80eba12832" - идентификатор, указание которого уже не требует ни пароля, ни логина, но он 1) длинный и сложный:) 2) устаревающий
Название: организация скачивания файлов с сервера
Отправлено: new_coder от 29 Января 2007, 12:34:20
т.е. ссылка заводиться не для конкретного пользователя а одна для всех на определенный срок?
или генерируется вместе с паролем для конкретного пользователя?
Название: организация скачивания файлов с сервера
Отправлено: CGVictor от 29 Января 2007, 16:23:37
new_coder
А как проще. Вообще, конечно, лучше требовать авторизации в системе, но многие не заморачиваются - скажем, 30-символьный id подделывать нецелесобразно.