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


Автор: mr.fox 20.11.2005, 04:16
Есть сайт, который торгует мелодиями, картинками (и тд) для телефонов.
Так вот, я никак не придумаю, как лучше отдавать файл на скачку пользователю?
Прямых линков давать нельзя!
Я думаю копировать файлик на время в папку какуюнибудь и отдавать на закачку, а потом удалять его оттуда через энном кол-во минут, которые высчитает алгоритм.
МОжет другие идеии будут? smile

Автор: Coder 20.11.2005, 06:22
Код

// отдаем пользователю файл для загрузки
  $get_name="file.zip"; // имя которое увидит пользователь
  $true_name="mWhilvs5tY9a9l3oRL83.zip"; // настоящее имя файла
  $f_size=filesize($true_name);
  header("Content-type: application/zip");
  header("Content-Disposition: attachment; filename=".$get_name.";");
  header("Accept-Ranges: bytes");
  header("Content-Length: ".$f_size);
  readfile($true_name);


только при использовании этого способа в .PHP файле не должно быть HTML тегов, иначе код не будет работать.

Автор: mr.fox 20.11.2005, 06:37
Coder, спасибо, хороший пример!
Я вот думаю, а если запоролить дирегторию, будет вся эта чепуха работать?

Автор: Mal Hack 20.11.2005, 14:01
Где- то я уже это описывал...
Суть такая.
Таблица первая - сессии.
В БД храним реальное и мнимое имя файла. Мнимое -
Код
$get_name="file.zip"

При апложе файла, его реальное имя пишется в базу, как мнимое, а на сервер он уже сохраняется под sdkfhn478h238y3r87y2.zip.
В тот момент, когда пользователь хочет скачать файл. Мы в таблицу сессий заносим какой-ть любой идентификатор аля md5, время через которое он умрет и ID файла.
Далее, пользователя перекидываем на линк: server.ru/download/идентификатор аля md5/
В скрипте проверяем этот идентификатор и время жизни сессии. Если все нормально, то отдаем файл пользователю в принципе так, как показад Coder, подставляя в переменные нужные значения из БД.

Замечания: 1. Надо время от времени чистить таблицу сессий.
2. Надо немножко с mod_rewrite похимичить.

Автор: AntonioBanderaz 20.11.2005, 18:16
Цитата(Mal @ 20.11.2005, 14:01)
1. Надо время от времени чистить таблицу сессий.

А если при каждом действии любого польз проверять базу и удалять старые данные?

Автор: Mal Hack 20.11.2005, 18:53
Цитата(AntonioBanderaz @ 20.11.2005, 18:16)
А если при каждом действии любого польз проверять базу и удалять старые данные?

Лишняя нагрузка. ИМХО, лучше раз в сутки из под CRON'a запускать скрипт очистки.

Автор: AkimVital 4.12.2005, 21:36
Можно сделать скрипт на PHP с использованиеь Rewrite Engine, преобразовывающий запросы типа host.com/file/name.mp3
в host.com/script.php?file=name.mp3
Скрипт принимает запрос авторизованного пользователя, и в отдельной таблице базы данных закачек проверяет, разрешено ли этому пользователю качать файл $file, (таблица типа: field1_user_id(int), field2_filepath(string)). После чего читает файл по 4Кб и пишет их в буфер.

Автор: anka 19.12.2006, 08:25
$filename="img.gif"
base64_encode($filename);

Автор: Alex13 19.12.2006, 13:06
mr.fox, я думаю, этот топик может помочь решить проблему: http://xpoint.ru/forums/programming/PHP/thread/20714.xhtml

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