Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Здравствуйте.
Прошу подсказать верное направление новичку.
Задача в целом: организовать продажу файлов.
Файлы только мои, юзеры ничего не заливают.
Пусть будут, например, картинки (типа личный фотосток). Юзеру после оплаты картинка становится доступной для скачивания (бесконечно долго).
И тут у меня возникает множество проблем. Где хранить эти файлы? Если в public-каталогах - то как быть с прямыми линками на файл (типа img/file.jpg), которые идут мимо маршрутизатора? Если в другом месте - то как их выдавать на скачивание? Каждый раз копировать в public и менять имя файла на трудноугадываемое, типа h3kjh2l32333y323sdf_file.jpg? Тогда со временем скопится куча одинаковых файлов с разными именами.
Собственно, вопрос: как грамотно организовать систему продажи файлов? Можно без конкретного кода, просто концепцию подскажите. Может, готовая библиотека какая-то есть? Гугл не помог.
Не в сети
Кажется такие вещи на коленке не делаются. Первое что приходит на ум cdn нужен на котором файлы хранить на другом сервере чем морда сайта. И его дергать по API с морды на которой ларавель. А на морде регистрация, авторизация, подписка на платные услуги и личный кабинет в котором хранятся купленные картинки
Не в сети
Спасибо за идею. Соорудил вот такой код для проверки:
Route::get('test', function(){
if (true){ //проверяем, можно ли отдавать файл
$filename = '1.jpg';
$file = Storage::disk('local')->get($filename);
return response($file)->header("Content-disposition", "attachment; filename=$filename")->header("Content-Type", "jpeg");
}
});
Вроде делает, то что требуется. Что скажете? Рабочий вариант?
Изменено dimatti (21.11.2017 17:31:59)
Не в сети
Вроде делает, то что требуется. Что скажете? Рабочий вариант?
Сейчас нет кода ларавела под рукой.
$file = Storage::disk('local')->get($filename);
Что этим делается? Считывается весь файл?
Если да - то, хватит ли тебе ОЗУ для отдачи больших файлов?
Изменено covobo (21.11.2017 17:48:20)
Не в сети
Класть эти изображения в хранилище (storage), и к примеру по роуту /image/get/123 отдавать это изображение. Перед отдачей проверять пользователя на возможность скачивать изображения. Ну а способов проверки масса, можно группы сделать, или тупо столбец в таблицу users добавить типо is_subscriber tinyint(1) default(0) и когда пользователь купил подписку, то ставить в это поле 1
Не в сети
Что этим делается? Считывается весь файл?Если да - то, хватит ли тебе ОЗУ для отдачи больших файлов?
Да, считывается весь файл.
Больших файлов не планируется. Максимум - единицы мегабайт.
Спасибо всем за помощь.
Изменено dimatti (21.11.2017 18:19:58)
Не в сети
Отдача статики через PHP это плохая идея, в первую очередь из-за производительности. Такую статику уже не загрузишь на CDN, ее нельзя докачать или скачать в несколько потоков (HTTP Range), также вместо обработки, например, 1000 запросов страниц в секунду мы получаем 1000 запросов и на статику, и на обычные страницы, а учитывая что картинок на странице может быть пара десятков, то реальное число обрабатываемых страниц от клиентов будет 1000/30 = 33!
Это не говоря о том, что почти наверняка запрос к скрипту вызовет обновление сессии и/или другие запросы/действия с ФС, которые совершенно излишни.
Используйте стандартные средства. Веб-сервер - это именно то, что заточено под раздачу статики. nginx, который и так у всех есть, имеет отличный модуль, который позволяет создавать временные ссылки на файлы по любому локальному пути. Файлы легко вынести на отдельный сервер(а), т.к. для авторизации ссылок в nginx нужен только хэш, никаких БД или другой связи с бекендом не нужно.
Этот вопрос стабильно появляется на форуме раз в три месяца. Предыдущие темы:
https://laravel.ru/forum/viewtopic.php?pid=11827#p11827
https://laravel.ru/forum/viewtopic.php?pid=12942#p12942
Не в сети
deleted
Изменено dimatti (28.02.2018 06:16:44)
Не в сети
Страницы 1