Логика галереи изображений Laravel

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

Я немного зациклен на логике. Таким образом, моя логика была бы такой.

Пользователь создает папку с именем, которое хранится в базе данных с прикрепленным к ней users id

таблица папок

Ряды

 id | folder | user_id 1 | Some folder | 1 2 | New folder | 4 3 | Nother folder | 7 

Таблица изображений

Ряды

 id | image_name | folder_id | 1 | image1.jpg | 1 2 | image2.jpg | 1 3 | image3.jpg | 1 4 | image4.jpg | 2 5 | image5.jpg | 2 6 | image6.jpg | 2 

связи

 class Folder extends Eloquent { public function images() { return static::has_many('Images'); } } class Image extends Eloquent { public function folder() { return static::belongs_to('Folder'); } } 

структура папок на сервере

 - samples -user_id - folder_id - image1 - image2 - image3 

так как вы можете видеть, пользователь создает папку после создания папки, user загружает имя изображения в базу данных с folders id и показывает изображения, как описано выше с реализацией.

Так что мои вопросы.

  • Является ли это хорошей логикой, на ваш взгляд
  • может ли это привести к проблемам в будущем?
  • что вы предлагаете для этой функции

И то, что я самый священный, – это 2 вещи.

Я думаю, что это приведет к огромной базе данных, во-вторых, к id's , после x времени, когда будет больше пользователей, количество id's увеличится, и я знаю, что это будет звучать странно, но поскольку много пользователей загрузит изображения, это приведет к огромным id, что я имею в виду, возможно, он достигнет миллионов, есть ли способ решить эту проблему?

Спасибо вам за помощь

Ok – позволяет разбить это на несколько суб-ответов;

Вопрос:

 - Is this a good logic in your opinion - Can this lead problems in the future - What would you offer for this functionality 

Ответ:

Логика кажется звуковой – но мне любопытно, где вы будете хранить изображения? Внутри public_html – или вне веб-корня? Если у вас есть изображения внутри public_html – и разрешить браузеру обращаться к ним напрямую, это позволит пользователям «угадывать» другие пользовательские папки и получать к ним доступ. Вам необходимо безопасно хранить данные.

Чтобы сделать изображения вне веб-корня , и убедитесь, что к ним доступны только авторизованные пользователи – вы должны использовать readfile () . Что-то вроде этого будет делать трюк

 function user_file($file_name = "") { if ($file_name) { // Ensure no funny business names to prevent directory transversal etc. $file_name = str_replace ('..', '', $file_name); $file_name = str_replace ('/', '', $file_name); // now do the logic to check user is logged in if (Auth::check()) { // Serve file via readfile() - we hard code the user_ID - so they // can only get to their own images readfile('../your_app/samples/'.Auth::user()->id.'/'.$file); } } } 

Вопрос:

Я думаю, что это приведет к огромной базе данных, во-вторых, к id, после x времени, когда будет больше пользователей, количество идентификаторов увеличится, и я знаю, что это будет звучать странно, но поскольку много пользователей загрузит изображения, это приведет к огромным id, что я имею в виду, возможно, он достигнет миллионов

Ответ:

Согласно странице функций mySQL :

Мы используем MySQL Server с базами данных, которые содержат 50 миллионов записей. Мы также знаем пользователей, которые используют MySQL Server с 200 000 таблицами и около 5 000 000 000 строк.

Так что 5 миллиардов строк. Вы, возможно, доберетесь до нескольких миллионов. Таким образом, вы здесь в безопасности (в зависимости от вашего оборудования).

Вопрос:

… но так как много пользователей загрузит изображения, это приведет к огромным id, что я имею в виду, возможно, это достигнет миллионов, есть ли способ решить эту проблему?

Ответ:

Если вы не хотите хранить миллионы записей и беспокоитесь о производительности, одним из вариантов является сохранение таблицы папок, но падение таблицы изображений. Вместо этого вы можете использовать scandir () в папке – и получить PHP для получения имен файлов из самой директории. Тогда у вас не так много накладных расходов.

 <?php $list_of_user_files = scandir("$user_id/$folder_id"); foreach ($list_of_user_files as $file) { echo "File: $file <br>"; } ?> 

Методом сохранения таблицы папок и использования функции scandir является стандартная процедура. И позвольте php извлекать имена файлов из папки. Если у вас есть несколько файлов, попробуйте классифицировать их с порядком года и месяца, как в wordpress. подобно

 2012 01 02 03 2013 01 02 03 

etc внутри идентификатора папки. Таким образом, общее количество изображений в папке будет относительно меньше.