Программирование > PHP
организация скачивания файлов с сервера
new_coder:
Такая задача.
1. есть файл на сервере.
2. есть набор клиентов (достоверно определяемые по email)
Необходимо выдовать временные пароли и ссылки на скачивание.
Подскажите общие принцыпы!
1. как на сервере хранить файл что б доступ был только с временных ссылок? (доступна только папка htdocs)
2. как создаются временные ссылки?
3. когда производть аутентификацию по паролю?
CGVictor:
new_coder
Совет номер ноль: поищи по форуму, уже много-много раз обсуждали.
3. Авторизацию проводищь когда тебе удобно. Главное, чтобы при запросе файла ты мог определить кто пользователь, собссно, такой. Session cookie для этого подходит.
2. Временные ссылки создаются случайным образом и заносятся в базу, в записи: идентификатор, время создания ссылки, файл оригинала, пользователь (если нужен).
Когда пользователь обращается за файлом, он так или иначе должен передать идентификатор временной ссылки твоему скрипту.
Что делает скрипт: смотрит, есть ли у него в базе такая ссылка, не истекло ли время, какие-то другие параметры. Если всё хорошо - отдает файл.
1. В папке с файлами положить .htaccess с чем-то вроде Deny from all. Тогда доступ будет только из твоих скриптов.
Неплохо бы еще заморочиться с content-range (чтобы пользователь мог "докачивать" файл), но это следующий этап.
new_coder:
спасибо
(поиском конечно пользовался)
new_coder:
такой вариант кода:
$HTML_Content = "<!DOCTYPE HTML PUBLIC \\"-//W3C//DTD HTML 4.01 Transitional//EN\\" \\"http://www.w3.org/TR/html4/loose.dtd\\">
<html>
<head>
<title>Сервер обновлений</title>
<meta http-equiv=\\"Content-Type\\" content=\\"text/html; charset=windows-1251\\">
</head>
<body>
";
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.="</body></html>";
echo $HTML_Content;
ваше мнение?
CGVictor:
new_coder
1. Запрос может отработать (true) но не вернуть значений. if(mysql_num_rows=1)
2. И где здесь временные ссылки? Я вижу только счетчик допустимого количества скачиваний файла для пользователя. Хотя возможно для твоей задачи большего и не надо.
Навигация
Перейти к полной версии