Xpoint
   [напомнить пароль]

загрузка файлов по паролю с поддержкой докачки

Метки: [без меток]
2007-08-21 14:27:24 [обр] Денис Т.[досье]

Условие задачи:
Нужно отдавать прайс зарегистрированным пользователям. Причём каждый авторизованный пользователь может скачать прайс только один раз. Повторить скачивание он может после того, как будет выложен новый прайс.

Эту задачу я решил с помощью pear-класса HTTP_Download. Но в данном случае не получается реализовать докачку через программы - менеджеры загрузок (например, Download Manager).
Есть ли решения для такой задачи?

спустя 8 минут [обр] Дмитрий Попов(171/509)[досье]

Надежных нет.
Докачка на то и докачка, что это новое соединение с дополнительными параметрами.
Проверить скачал ли пользователь файл целиком невозможно.

Вообще задача не очень хорошо решена - ибо что делать пользователю, если у него оборвалось соединение во время закачки, и он при этом не пользуется менеджерами?

Рекомендации могу дать две:

  1. Отслеживать не по количетсву скачек, а, до пустим по времени, между первым запросом файла пользователем и текущем (например, после старта закачки, у пользователя есть час на то, что бы скачать)
  2. Ну банально проверять seek-заголовок (не помню как он точно называется), и если он больше 0 то отдавать кусок, если параметра нету 0 - то второй раз не отдавать.

Можно совместить 1 и 2, но все равно проблемы возникнут, ибо оба способа ненадежны на 100%.

спустя 8 минут [обр] Денис Т.[досье]
А я не по кол-ву закачек отслеживаю, я храню дату последнего скачивания, если она больше даты файла, значит файл уже был загружен. Иначе можно отдавать клиенту файл.
А как проверять по времени? Всё равно ведь нужно идентифицировать пользователя.
Поясните Ваши рекомендации, пожалуйста, если не трудно.
спустя 33 минуты [обр] Дмитрий Попов(171/509)[досье]
Так... А как Вы идентифицируете клиента, который скачивает?
спустя 14 часов [обр] Денис Т.[досье]
Он вводит свои логин и пароль. При удачном скачивании в базе сохраняется дата загрузки файла.
спустя 1 час 25 минут [обр] Алексей Полушин(62/231)[досье]
А как вы определяете удачное скачивание ? На уровне РНР это в принципе невозможно. Например в такой ситуации - вы весь файл отдали, но он еще лежит в где-то выходном буфере, а в этот момент произошел обрыв соединения - вы никак не сможете узнать, что клиент файл не получил.
спустя 11 минут [обр] Денис Т.[досье]

Вот код:

   $params = array(
      'file'                => 'path_to_file/price.zip',
      'contenttype'         => 'application/zip',
      'contentdisposition'  => array(HTTP_DOWNLOAD_ATTACHMENT, 'price.zip'),
      'cache'               => false
      );
      $error = HTTP_Download::staticSend($params, false); //отдаём файл
      if ($error === true) {
           //если файл загружен успешно, обновляем дату последней закачки
      }

Конечно, это малонадёжный вариант, но порой срабатывает. А сегодня утром один клиент даже умудрился воспользоваться докачкой.
Но я вообще интересуюсь, может, есть какие-то другие способы?
Например, можно делать временную ссылку на файл, которая по истечении какого-то периода времени будет удалена. Недостаток здесь тот, что она будет на этот период доступна всем, кому клиент захочет её передать.

спустя 1 час 32 минуты [обр] Александр Галкин(112/211)[досье]

Денис Т.[досье]
А что мешает клиенту распространить ваш файл уже после скачивания? Почтой разослать, например?

Ограничения доступа по времени, авторизации и IP, с которого началось скачивание, должно быть вполне достаточно, по-моему.

спустя 10 минут [обр] Денис Т.[досье]
Александр Галкин[досье], абсолютно ничего не мешает. Но такое уж условие задачи.
Powered by POEM™ Engine Copyright © 2002-2005