Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2013, 12:57   #1
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию Загрузка изображений. Хранение картинки в базе.

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

Я столкнулся с небольшой проблемой:
Допустим есть каталог автомобилей. Название картинок у меня в данном случае avto1, avto2, avto145 и т. д. В базе же, в поле для изображений хранятся форматы изображений, для меня это достаточно, потому что картинка связана по ID с товаром в имени. То есть я вывожу адрес картинки следующим образом:
PHP код:
../images/avto/avto<?=$res['id'].$res['image']?>
На нескольких небольших проектах это было удобно и меня все устраивало, но недавно я столкнулся с проблемой, что при добавлении какой то позиции (сделал админку для этого) в обработчике нужно сначала узнать какой ID последний в базе чтобы не было дупликатов, а это дополнительный запрос. Причем, если картинка загружается сразу без перезагрузки страницы (скажем, через iframe) то возникнет нехорошая ситуация, если два пользователя одновременно будут добавлять позиции.

Хотелось бы спросить у вас, как вы связываете позиции из базы данных с изображениями? И как избежать проблемы с одновременным добавлением, когда картинка сразу грузится на сервер?
Mr_freeman вне форума Ответить с цитированием
Старый 07.02.2013, 13:50   #2
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

1. давать уникальные имена картинкам - например md5(mktime())
2. создавать для каждого пользователя папку, в путь картинки включать id пользователей - тогда допустимы названия одинаковы.. но в разных папках .. ну и опять же уникальное имя давать
3. перед сохранением картинки - проверять - есть такое имя, если есть добавлять например 1... опять проверять ... если есть то не 1 а 2 добавлять - и так в цикле
кароче способов много ))
ADSoft вне форума Ответить с цитированием
Старый 07.02.2013, 16:24   #3
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию

Если давать имя
PHP код:
<? $name=md5(time()); ?>
его придется хранить в базе, а если у нас много тысяч картинок, не будет ли набор 32 символов, дублируясь много раз, занимать много места?

И еще вопрос, можно ли как то загрузить картинку через iframe, не сохраняя ее на сервере - то есть только для предпросмотра, а потом уже при отправке основной формы соответственно сохранить?
Mr_freeman вне форума Ответить с цитированием
Старый 07.02.2013, 16:52   #4
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

1. да хранить имена картинок нужно в базе, и на миллионы записей не найдется одного дубля .. .почитайте про md5 .... размер в 32 символа, совсем не считаю критическим... больше можно - для уникальности, меньше - не стоит
2. загружать на сервер нужно полюбому..... там делать перевьючить и аяксом или ифреймом показывать для предпросмотра, а потом если нужно уже сохранять в бд
ADSoft вне форума Ответить с цитированием
Старый 07.02.2013, 18:47   #5
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
и на миллионы записей не найдется одного дубля .. .почитайте про md5
Я в курсе, неправильно выразил мысль просто)

Цитата:
Сообщение от ADSoft Посмотреть сообщение
2. загружать на сервер нужно полюбому..... там делать перевьючить и аяксом или ифреймом показывать для предпросмотра, а потом если нужно уже сохранять в бд
А если после предпросмотра пользователь закроет страницу, что тогда делать, ведь файл останется? Может использовать какую то таблицу специально для превьюшек? А потом, кроном например, раз в день удалять мусор. Или можно проще как то?
Mr_freeman вне форума Ответить с цитированием
Старый 07.02.2013, 19:01   #6
buriat
Форумчанин
 
Регистрация: 28.06.2010
Сообщений: 189
По умолчанию

Цитата:
Сообщение от Mr_freeman Посмотреть сообщение
А если после предпросмотра пользователь закроет страницу, что тогда делать, ведь файл останется? Может использовать какую то таблицу специально для превьюшек? А потом, кроном например, раз в день удалять мусор. Или можно проще как то?
Думаю удалять файлы надо когда юзер уходит со страницы, иначе есть вероятность того что они сотрутся перед тем как юзер их "подтвердит"
buriat вне форума Ответить с цитированием
Старый 07.02.2013, 19:23   #7
Mr_freeman
Форумчанин
 
Аватар для Mr_freeman
 
Регистрация: 17.01.2010
Сообщений: 277
По умолчанию

Цитата:
Сообщение от buriat Посмотреть сообщение
Думаю удалять файлы надо когда юзер уходит со страницы, иначе есть вероятность того что они сотрутся перед тем как юзер их "подтвердит"
Разве есть событие на уход юзера со страницы?
Mr_freeman вне форума Ответить с цитированием
Старый 07.02.2013, 19:35   #8
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

в таблицу основоную записывать сразу - но например статус - не показывать..... если записи больше скольких то часов и не изменился статус - удалять...
ADSoft вне форума Ответить с цитированием
Старый 07.02.2013, 22:32   #9
buriat
Форумчанин
 
Регистрация: 28.06.2010
Сообщений: 189
По умолчанию

Цитата:
Сообщение от Mr_freeman Посмотреть сообщение
Разве есть событие на уход юзера со страницы?
Есть, window.onunload, window.onbeforeunload.

Цитата:
Сообщение от ADSoft Посмотреть сообщение
в таблицу основоную записывать сразу - но например статус - не показывать..... если записи больше скольких то часов и не изменился статус - удалять...
+
buriat вне форума Ответить с цитированием
Старый 08.02.2013, 12:17   #10
Stroy562
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 49
По умолчанию

Код:
time().mktime().session_id()
time() - Возвращает время до секунды
mktime() - Возвращает количество миллисекунд
session_id() - Возвращает, присваиваемый автоматически, уникальный номер пользователя. Ни когда не повторяется и не дублируется.
В связке с текущим временем (миллисекунды) можно с генерировать 100% уникальное имя файла
Stroy562 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хранение изображений в базе данных (Delphi) Копоть Артём Помощь студентам 3 07.02.2012 18:36
хранение изображений на сервере vvsh Общие вопросы по программированию, компьютерный форум 1 20.11.2011 20:35
Хранение изображений (в файловой системе) SamFisher88 ASP.NET 0 08.11.2011 13:35
Хранение изображений в базе Водка Microsoft Office Access 1 12.02.2010 17:39
Хранение *.pdf в базе Acess opel.omega БД в Delphi 15 30.12.2008 00:04