Автор Тема: организация скачивания файлов с сервера  (Прочитано 7393 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн new_coder

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 33
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Такая задача.

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

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

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

1. как на сервере хранить файл что б доступ был только с временных ссылок? (доступна только папка htdocs)
2. как создаются временные ссылки?
3. когда производть аутентификацию по паролю?

Оффлайн CGVictor

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
организация скачивания файлов с сервера
« Ответ #1 : 23 Января 2007, 15:47:26 »
new_coder
Совет номер ноль: поищи по форуму, уже много-много раз обсуждали.

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

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

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

Неплохо бы еще заморочиться с content-range (чтобы пользователь мог "докачивать" файл), но это следующий этап.
LJ: Backslashed life (rss)

Оффлайн new_coder

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 33
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
организация скачивания файлов с сервера
« Ответ #2 : 25 Января 2007, 10:41:01 »
спасибо

(поиском конечно пользовался)

Оффлайн new_coder

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 33
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
организация скачивания файлов с сервера
« Ответ #3 : 26 Января 2007, 10:19:03 »
такой вариант кода:


$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-Typeapplication/force-download\\r\\n"); 
	
	
	
	
	
header("
Content-Transfer-Encodingbinary\\r\\n"); 
	
	
	
	
	
header("
Content-Length".filesize($path.$res_sel[\'file\'])); 
	
	
	
	
	
header("
Content-Dispositionattachmentfilename=".$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

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
организация скачивания файлов с сервера
« Ответ #4 : 26 Января 2007, 13:01:23 »
new_coder
1. Запрос может отработать (true) но не вернуть значений. if(mysql_num_rows=1)

2. И где здесь временные ссылки? Я вижу только счетчик допустимого количества скачиваний файла для пользователя. Хотя возможно для твоей задачи большего и не надо.
LJ: Backslashed life (rss)

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
организация скачивания файлов с сервера
« Ответ #5 : 26 Января 2007, 13:20:38 »
по мелочам:
- обязательно надо проверять результаты, не было ли ошибок при выполнении запросов (особенно Insert, Delete).
- для проверки доступности файла  - лучше is_readable
- убери die("скачал");  иначе это слово тоже попадет в файл клиенту :)
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн CGVictor

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
организация скачивания файлов с сервера
« Ответ #6 : 26 Января 2007, 13:35:47 »
Макс
* die не попадет, у него content-length правильно дописывается
LJ: Backslashed life (rss)

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
организация скачивания файлов с сервера
« Ответ #7 : 26 Января 2007, 13:49:44 »
CGVictor
да, был не прав
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн new_coder

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 33
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
организация скачивания файлов с сервера
« Ответ #8 : 26 Января 2007, 14:39:12 »
временная ссылка это линк на этот скрипт

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

или обычно это что-то другое?

Оффлайн CGVictor

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
организация скачивания файлов с сервера
« Ответ #9 : 26 Января 2007, 18:17:06 »
new_coder
* Передавать пароль get-ом не слишком правильно.

Это обычно host.tld/script?7283afd02138ff80eba12832.
"7283afd02138ff80eba12832" - идентификатор, указание которого уже не требует ни пароля, ни логина, но он 1) длинный и сложный:) 2) устаревающий
LJ: Backslashed life (rss)

Оффлайн new_coder

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 33
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
организация скачивания файлов с сервера
« Ответ #10 : 29 Января 2007, 12:34:20 »
т.е. ссылка заводиться не для конкретного пользователя а одна для всех на определенный срок?
или генерируется вместе с паролем для конкретного пользователя?

Оффлайн CGVictor

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
организация скачивания файлов с сервера
« Ответ #11 : 29 Января 2007, 16:23:37 »
new_coder
А как проще. Вообще, конечно, лучше требовать авторизации в системе, но многие не заморачиваются - скажем, 30-символьный id подделывать нецелесобразно.
LJ: Backslashed life (rss)

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28