|
|
|
| Здравствуйте.
Нужно разработать сайт по продаже файлов. Как организовать хранение файлов и дачу ссылок на них после оплаты? У меня есть следующие мысли:
Хранить будем так:
Все файлы хранятся в директории, туда помещен .htaccess c кодом
А с выдачей ссылок на файлы после оплаты не все так однозначно.
Способ 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 с таким кодом:
В таком случае, будет ли файл достаточно защищен от скачивания другими пользователями?
Какой способ лучше или есть другие решения?
PS А как сделать, чтобы pdf-файл не открывался в акробате, а скачивался? | |
|
|
|
|
|
|
|
для: 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");
|
Проверь сразу права на каталог и скачиваемый файл . | |
|
|
|
|
|
|
|
для: antf
(16.12.2009 в 07:18)
| | > В таком случае, будет ли файл достаточно защищен от скачивания другими пользователями?
Способ 2 вообще никакую защиту не делает.
> Файлы будут большими от 30 мб, но не больше 100-200 мб
Тогда никаких file_get_contents(). Иначе парочка качающих забьёт всю память серверу.
Здесь только fopen() / fread(). А ведь ещё и о докачке подумать надо. | |
|
|
|
|
|
|
|
для: Саня
(16.12.2009 в 12:36)
| | >Тогда никаких file_get_contents(). Иначе парочка качающих забьёт всю память серверу.
Вот не понимаю я...
Антон, как Вы могли вообще такое написать?
>Здесь только fopen() / fread(). А ведь ещё и о докачке подумать надо.
fopen/fpassthru | |
|
|
|
|
|
|
|
для: Trianon
(16.12.2009 в 13:28)
| | >Антон, как Вы могли вообще такое написать?
Не делал еще такого. Хотя мысли на то, что память будет забита были. В общем такой способ есть, хотя и с существенным ограничением. | |
|
|
|
|
|
|
|
для: Саня
(16.12.2009 в 12:36)
| | >Способ 2 вообще никакую защиту не делает.
Почему не дает? По идее в директории будут файлы с измененными именами. Список их клиенту получить нельзя (Options -Indexes). Имя файла известно только качающему. Файлы будут удаляться. | |
|
|
|
|
|
|
|
для: antf
(16.12.2009 в 17:46)
| | Вот как раз на время качания файлы не защищены никак. | |
|
|
|
|
|
|
|
для: Саня
(16.12.2009 в 18:58)
| | >Вот как раз на время качания файлы не защищены никак.
Третьи лица не смогут узнать имя файла, если, конечно, пользователь не передаст ссылку.
Можно, конечно, еще создавать скриптом директорию, туда помещать файл и .htaccess с ограничением доступа по ip качающего. | |
|
|
|
|
|
|
|
для: antf
(16.12.2009 в 19:20)
| | Но всё равно этот метод плох. Что произойдёт, если одновременно будет качаться много файлов? | |
|
|
|
|
|
|
|
для: Саня
(16.12.2009 в 19:29)
| | Какой способ. Первый? Да, он плох. | |
|
|
|
|
|
|
|
для: antf
(16.12.2009 в 19:37)
| | > Что произойдёт, если одновременно будет качаться много файлов?
А произойдёт превышение дисковой квоты.
Тем более регулярные копирования/удаления больших файлов не идут на пользу дисковой системе и общей производительности.
> Первый? Да, он плох.
Оба варианта плохи для определённых ситуаций. Первый плох тем, что большое количество одновременных "медленных" запросов может сделать сайт недоступным из-за превышения лимита одновременных запросов. Второй плох тем, что ему требуется большая дисковая квота и быстрая дисковая система.
В любом случае при увеличении популярности разрабатываемого вами сервиса оба варианта откажут.
Всё ведь происходит на обычном shared хостинге... | |
|
|
|
|
|
|
|
для: Саня
(16.12.2009 в 19:58)
| | >Первый плох тем, что большое количество одновременных "медленных" запросов может сделать сайт недоступным из-за превышения лимита одновременных запросов. Второй плох тем, что ему требуется большая дисковая квота и быстрая дисковая система.
Но ведь как-то работают подобные магазины... | |
|
|
|
|
|
|
|
для: antf
(16.12.2009 в 20:02)
| | Они обычно арендуют сервера и настраивают схему, одна из реализаций которой описана в статье. | |
|
|
|
|
|
|
|
для: Саня
(16.12.2009 в 19:58)
| | Скорее всего будет выделенный сервер. | |
|
|
|
|
|
|
|
для: antf
(16.12.2009 в 20:07)
| | Тогда не надо заморачиваться, а сделать как описано в статье. | |
|
|
|
|
|
|
|
для: Саня
(16.12.2009 в 19:58)
| | Вот тут какая вещь...
Существуют еще жесткие файловые ссылки, и символические.
И превышать дисковую квоту в этом случае совсем таки необязательно.
Правда, где-то пробегало мнение, что при открытом форвардинге по символическим ссылкам, страдает безопасность, но вот слух это или явь, и в чем там проблема, я как-то не в курсе. | |
|
|
|
|
|
|
|
для: antf
(16.12.2009 в 19:20)
| | >если, конечно, пользователь не передаст ссылку.
Собственно, в этом случае ничто не мешает ему передать и сам файл. Так что я считаю данный способ вполне состоятельным. Вместо копии делаю просто симлинк. Раздает все это дело ngnix - апачу без того есть чем заняться.
Первый способ был реализован, но без докачки он слишком тупой, а с докачкой весьма быстро кладет сервер. Так что пришлось его оставить в истории. | |
|
|
|
|
|
|
|
для: antf
(16.12.2009 в 07:18)
| | Или вот ещё вариант: http://habrahabr.ru/blogs/webdev/37686/
Правда тут нужна двухуровневая конфигурация nginx -> apache, которая далеко не на каждом хостинге стоит. | |
|
|
|
|
|
|
|
для: antf
(16.12.2009 в 07:18)
| | Я когдато с этим столкнулся.
Беру , помоему с помощю ,mkdir() создаю директорию с именем session_id() - чтоб для одной сессии хранились несколько файлов. Копирую в нее файл с помощю copy() и даю ссылку на скачивание. А в директорию на уровень ниже вкладываю index.html и все. таким образом не нужен .htaccess и возможна докачка файлов. Правда php5 у меня более 760 МБ не копирует а php4 более 4000 Мб.
Но я это делал на собственном физическом сервере, поэтому думаю на хостинг такой вариант может и не покатить. | |
|
|
|