Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Магазин по продаже файлов: вопрос по способу хранения файлов и даче ссылок на них
 
 автор: antf   (16.12.2009 в 07:18)   письмо автору
 
 

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


Хранить будем так:

Все файлы хранятся в директории, туда помещен .htaccess c кодом


deny from all


А с выдачей ссылок на файлы после оплаты не все так однозначно.

Способ 1
Можно сделать такой скрипт:


<?php
  
//увеличиваем время работы скрипта
  
set_time_limit(0);  

  
//проверяем оплачен ли заказ  

  //выдаем файл
  
$txt file_get_contents("test/file.pdf");
  
header("Content-type: application/pdf");
  print 
$txt;
?>


Файлы будут большими от 30 мб, но не больше 100-200 мб. Какие могут возникнуть сложности?

Способ 2

Копировать файл в директорию files/{идентификатор сессии}.pdf и оттуда скачивать. По истечении некоторого времени файл удаляется кроном. Для того, чтобы посетители не смогли увидеть листинг файлов в директории, в корне директории files/ помещается .htaccess с таким кодом:


Options -Indexes


В таком случае, будет ли файл достаточно защищен от скачивания другими пользователями?

Какой способ лучше или есть другие решения?

PS А как сделать, чтобы pdf-файл не открывался в акробате, а скачивался?

  Ответить  
 
 автор: Softic   (16.12.2009 в 10:43)   письмо автору
 
   для: antf   (16.12.2009 в 07:18)
 

Попробуй так, у меня получалось:

$file_cont= file_get_contents($_GET["attachment"]);
    eecho($file_cont)    // проверка читается ли файл
    $download_file="history.txt"; 
     header("Content-disposition: attachment; filename=$download_file");
     header("Content-Type: application/force-download");
     header("Content-Transfer-Encoding: binary");
     header("Content-Length: ".strlen($file_cont));
     header("Pragma: no-cache");


Проверь сразу права на каталог и скачиваемый файл .

  Ответить  
 
 автор: Саня   (16.12.2009 в 12:36)   письмо автору
 
   для: antf   (16.12.2009 в 07:18)
 

> В таком случае, будет ли файл достаточно защищен от скачивания другими пользователями?
Способ 2 вообще никакую защиту не делает.

> Файлы будут большими от 30 мб, но не больше 100-200 мб
Тогда никаких file_get_contents(). Иначе парочка качающих забьёт всю память серверу.
Здесь только fopen() / fread(). А ведь ещё и о докачке подумать надо.

  Ответить  
 
 автор: Trianon   (16.12.2009 в 13:28)   письмо автору
 
   для: Саня   (16.12.2009 в 12:36)
 

>Тогда никаких file_get_contents(). Иначе парочка качающих забьёт всю память серверу.

Вот не понимаю я...
Антон, как Вы могли вообще такое написать?

>Здесь только fopen() / fread(). А ведь ещё и о докачке подумать надо.

fopen/fpassthru

  Ответить  
 
 автор: antf   (16.12.2009 в 17:51)   письмо автору
 
   для: Trianon   (16.12.2009 в 13:28)
 

>Антон, как Вы могли вообще такое написать?

Не делал еще такого. Хотя мысли на то, что память будет забита были. В общем такой способ есть, хотя и с существенным ограничением.

  Ответить  
 
 автор: antf   (16.12.2009 в 17:46)   письмо автору
 
   для: Саня   (16.12.2009 в 12:36)
 

>Способ 2 вообще никакую защиту не делает.

Почему не дает? По идее в директории будут файлы с измененными именами. Список их клиенту получить нельзя (Options -Indexes). Имя файла известно только качающему. Файлы будут удаляться.

  Ответить  
 
 автор: Саня   (16.12.2009 в 18:58)   письмо автору
 
   для: antf   (16.12.2009 в 17:46)
 

Вот как раз на время качания файлы не защищены никак.

  Ответить  
 
 автор: antf   (16.12.2009 в 19:20)   письмо автору
 
   для: Саня   (16.12.2009 в 18:58)
 

>Вот как раз на время качания файлы не защищены никак.

Третьи лица не смогут узнать имя файла, если, конечно, пользователь не передаст ссылку.

Можно, конечно, еще создавать скриптом директорию, туда помещать файл и .htaccess с ограничением доступа по ip качающего.

  Ответить  
 
 автор: Саня   (16.12.2009 в 19:29)   письмо автору
 
   для: antf   (16.12.2009 в 19:20)
 

Но всё равно этот метод плох. Что произойдёт, если одновременно будет качаться много файлов?

  Ответить  
 
 автор: antf   (16.12.2009 в 19:37)   письмо автору
 
   для: Саня   (16.12.2009 в 19:29)
 

Какой способ. Первый? Да, он плох.

  Ответить  
 
 автор: Саня   (16.12.2009 в 19:58)   письмо автору
 
   для: antf   (16.12.2009 в 19:37)
 

> Что произойдёт, если одновременно будет качаться много файлов?
А произойдёт превышение дисковой квоты.
Тем более регулярные копирования/удаления больших файлов не идут на пользу дисковой системе и общей производительности.

> Первый? Да, он плох.
Оба варианта плохи для определённых ситуаций. Первый плох тем, что большое количество одновременных "медленных" запросов может сделать сайт недоступным из-за превышения лимита одновременных запросов. Второй плох тем, что ему требуется большая дисковая квота и быстрая дисковая система.

В любом случае при увеличении популярности разрабатываемого вами сервиса оба варианта откажут.
Всё ведь происходит на обычном shared хостинге...

  Ответить  
 
 автор: antf   (16.12.2009 в 20:02)   письмо автору
 
   для: Саня   (16.12.2009 в 19:58)
 

>Первый плох тем, что большое количество одновременных "медленных" запросов может сделать сайт недоступным из-за превышения лимита одновременных запросов. Второй плох тем, что ему требуется большая дисковая квота и быстрая дисковая система.

Но ведь как-то работают подобные магазины...

  Ответить  
 
 автор: Саня   (16.12.2009 в 20:06)   письмо автору
 
   для: antf   (16.12.2009 в 20:02)
 

Они обычно арендуют сервера и настраивают схему, одна из реализаций которой описана в статье.

  Ответить  
 
 автор: antf   (16.12.2009 в 20:07)   письмо автору
 
   для: Саня   (16.12.2009 в 19:58)
 

Скорее всего будет выделенный сервер.

  Ответить  
 
 автор: Саня   (16.12.2009 в 20:24)   письмо автору
 
   для: antf   (16.12.2009 в 20:07)
 

Тогда не надо заморачиваться, а сделать как описано в статье.

  Ответить  
 
 автор: Trianon   (16.12.2009 в 23:35)   письмо автору
 
   для: Саня   (16.12.2009 в 19:58)
 

Вот тут какая вещь...
Существуют еще жесткие файловые ссылки, и символические.
И превышать дисковую квоту в этом случае совсем таки необязательно.
Правда, где-то пробегало мнение, что при открытом форвардинге по символическим ссылкам, страдает безопасность, но вот слух это или явь, и в чем там проблема, я как-то не в курсе.

  Ответить  
 
 автор: Loki   (22.12.2009 в 17:47)   письмо автору
 
   для: antf   (16.12.2009 в 19:20)
 

>если, конечно, пользователь не передаст ссылку.
Собственно, в этом случае ничто не мешает ему передать и сам файл. Так что я считаю данный способ вполне состоятельным. Вместо копии делаю просто симлинк. Раздает все это дело ngnix - апачу без того есть чем заняться.
Первый способ был реализован, но без докачки он слишком тупой, а с докачкой весьма быстро кладет сервер. Так что пришлось его оставить в истории.

  Ответить  
 
 автор: Саня   (16.12.2009 в 13:11)   письмо автору
 
   для: antf   (16.12.2009 в 07:18)
 

Или вот ещё вариант: http://habrahabr.ru/blogs/webdev/37686/
Правда тут нужна двухуровневая конфигурация nginx -> apache, которая далеко не на каждом хостинге стоит.

  Ответить  
 
 автор: toproot   (25.12.2009 в 20:01)   письмо автору
 
   для: antf   (16.12.2009 в 07:18)
 

Я когдато с этим столкнулся.
Беру , помоему с помощю ,mkdir() создаю директорию с именем session_id() - чтоб для одной сессии хранились несколько файлов. Копирую в нее файл с помощю copy() и даю ссылку на скачивание. А в директорию на уровень ниже вкладываю index.html и все. таким образом не нужен .htaccess и возможна докачка файлов. Правда php5 у меня более 760 МБ не копирует а php4 более 4000 Мб.

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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования