2012-02-28 1 views
0

Я разрабатываю веб-сайт с использованием структуры Yii. На моем сайте у меня есть профили пользователей (уже реализованы). У меня будет файловый загрузчик, чтобы пользователи могли загружать изображения профиля. Некоторые профили могут быть доступны для общественности, другие будут частными. Частные профили должны быть недоступны для публичных пользователей, и изображения в этом профиле могут быть недоступны для всех, кроме владельца профиля.Как сохранить изображения профиля пользователя в частном порядке, чтобы он был доступен только владельцу профиля?

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

Любые намеки или идеи будут оценены (связанные с Yii, php или любым другим). Дайте мне знать, если мой вопрос неясен. Спасибо.

* Кстати, у меня никогда не было формального курса по веб-разработке, и, как и многие другие, я узнал все, что знаю в свое время, поэтому очень возможно, что мне не хватает очень простого/очевидного решения.

+1

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

+0

Спасибо за ответ. Наверное, я не совсем понял это. Я уже реализовал его, как вы предложили (с частными и общедоступными пользователями, а пользователи, которые взломают URL-адрес, отправляются на страницу с ошибкой/доступом к отказам). Тем не менее, я обеспокоен тем, что «умным» пользователям может быть доступно доступ к изображениям частного пользователя через какой-либо URL-адрес (поскольку изображения хранятся в открытом доступе). И, как указано выше, причина, по которой я не хочу хранить его в защищенном домене, заключается в том, что я не смогу отображать изображения вообще на пользовательских страницах, но, возможно, я ошибаюсь, думая об этом? – Denzil

ответ

1

После того, как пользователь загрузит изображение, получите имя случайного изображения, например. mt_rand(30,999). imageExtension.
Сохраните это значение как имя пользователя в таблице image. Таблица изображений содержит свои собственные id, user_id и столбцы name.

В модели Yii Image create protected function afterSave() метод, который сохранит ваше изображение в файловой системе. Ваше реальное имя изображения в файловой системе будет состоять из идентификатора изображения в базе данных и имени изображения из базы данных.
Не забудьте добавить followin строку в этой функции:

return parent::afterSave(); 

Пример:
Вы JPG изображения называется me.jpg
mt_rand (30999) дает нам 421
Таким образом, вы храните JPG изображение базы данных.
Строка имеет значения:
id=7, user_id=3, name=421.jpg
Теперь вы сохраняете изображение под названием 7_421.jpg.
Сделав это, ваше изображение никогда не получит одно и то же имя дважды, так как id, который мы используем в первой части имени изображения, уникален.Более того, никто не узнает имя изображения, потому что ему понадобится как id, так и случайное число.

Чтобы отобразить изображение только для владельца вы сравнить зафиксированная идентификатор пользователя совпадает с user_id , выполнив:

if(Yii::app()->user->id === $image->user_id) { 
// display photo 
} 

Вам не нужно заботиться о сессии. Yii делает для вас.

+0

Хм спасибо. У меня уже есть работа, но несколько иначе. Я принимаю ваш ответ, хотя, как вы, кажется, задумались над этим, и это яснее, на мой взгляд. В моей текущей реализации я сохраняю свои изображения вне досягаемости общедоступного домена, а затем обслуживаю изображения через php-файл. Я думаю, что я немного поменю, чтобы это было похоже на это (в конце концов, это должно быть до некоторой степени). – Denzil

2

служит изображения через PHP-файл, который может проверить, есть ли они текущая сессия разрешение

+0

Хорошо спасибо. Я понятия не имею, как это сделать, но я посмотрю. – Denzil

2

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

После входа в систему вы, конечно же, установите сеанс (по крайней мере, идентификатор пользователя).

Создайте image_profile.php и получите user_id из сеанса в этом файле. После этого выполнить такой запрос:

SELECT `profile_image_filename` 
FROM user WHERE user.id = {$SESSION['user_id']} 
LIMIT 1; 

, а затем отправить {$profile_image_filename}.jpg так, что результат image_profile.php будет изображение профиля пользователя, вошедшего в систему пользователя. (Как выводить изображение динамически? Output an Image in PHP)

+0

Это похоже на то, что я смогу сделать без слишком большой работы с точки зрения обучения от моего имени. Спасибо за помощь! – Denzil

+1

, а не рандомизировать имя файла, сохранить изображение на недоступном пути, на котором может читать сервер, тогда он будет действительно «частным» – miki

Смежные вопросы