Легирование загруженных картинок

Статус
В этой теме нельзя размещать новые ответы.

NOIP

Гуру форума
Регистрация
17 Фев 2008
Сообщения
327
Реакции
77
Доброго времени суток, есть форма через которую можно прикреплять картинки, загрузка поддерживает мультизагрузку без ограничений, то есть в теории можно закончить все дисковое пространство загрузил пару сотен тысяч картинок. собственно вопрос, как можно защитится от такой проблемы?

Придумал записывать ИД пользователя который загружает картинки в БД + путь до картинки а как быть с ИД темы? ведь ID можно будет получить после создания темы, в общем кто сталкивался с подобным? подскажите как реализовали?

Если тема не прошла модерацию картинки нужно удалять, смысл их хранить? Ну и конечно же это защита от дураков.
 
Sql - Это Mysql, MS SQL, Postgres, SQLite? В зависимости от субд возможны различные варианты.
В Mysql мне не встречалась возможность запустить bash команду из тригера или процедуру. (Хотя возможно в новых версиях она появилась).
Поэтому проще имхо добавить картинкам флаг to_delete, и по крону удалять эти картинки.
В Postgres есть возможность запускать скриптовые команды из процедур
Для просмотра ссылки Войди или Зарегистрируйся
Поэтому проще сделать через триггер имхо.
В SQLServe по-моему тоже можно через триггер (но это не точно)
Про SQLite гугли =)
 
В моем случае Mysql.

Для просмотра ссылки Войди или Зарегистрируйся, то есть по умолчанию постить картинки to_delete и что если статья прошла модерацию, что тогда? как искать загруженные картинки? просто как то сложно получается. При загрузке я пишу в БД данные, ИД пользователя и полный путь до картинки. Далее что делать?

Допустим статья опубликована, мне как менять статус на удаление? перебирать все картинки которые залиты с все возможными в БД? не понимаю.
 
Последнее редактирование модератором:
Нет. По умолчанию для всех картинок to_delete равно нулю.
В таблице с картинками храните внешний ключ на талицу тем.
В простом случае: id, theme_id, path
На таблицу тем вешаете триггер примерно такого содержания:

CREATE TRIGGER delete_images AFTER DELETE on themes
FOR EACH ROW
BEGIN
upadate images set images.to_delete = 1 where images.theme_id=themes.id
END

Затем добавляете в крон скрипт (допустим раз в час), который ищет эти картинки, удаляет
файлы из системы, а затем записи из таблицы images.
 
Вот конкретно в данном случае тригер будет антипатерном:
- потому как ответственность за удаление картинок лежит не на БД!
- мы привязываемся к конкретной БД, на NoSQL уже так просто не переедешь.
- если в какой-то момент все картинки уедут на другой сервер с общением по апи, больше 90% что про триггер забудут и удаления вообще не будет...
- эта же картинка потребуется и в других местах, тоже делаем триггеры на все таблицы?

Как что-то похожее делал я:
При загрузке - пишем в бд и ставим картинке статус inactive + дата создания.
При добавлении к статье - меняем статус на published

По крону раз в сутки или реже ищем картинки не связанные со статьями, комментариями, личными сообщениями, ... с датой добавления больше суток (минимум). Если такое нашлось удаляем с сервера и потом при успешном удалении с ФС удаляем или помечаем удаленным в базе - deleted. При невозможности удаления - ставим статус delError и уведомляем админа.
 
Вот конкретно в данном случае тригер будет антипатерном:
- потому как ответственность за удаление картинок лежит не на БД!
- мы привязываемся к конкретной БД, на NoSQL уже так просто не переедешь.
- если в какой-то момент все картинки уедут на другой сервер с общением по апи, больше 90% что про триггер забудут и удаления вообще не будет...
- эта же картинка потребуется и в других местах, тоже делаем триггеры на все таблицы?

Как что-то похожее делал я:
При загрузке - пишем в бд и ставим картинке статус inactive + дата создания.
При добавлении к статье - меняем статус на published

По крону раз в сутки или реже ищем картинки не связанные со статьями, комментариями, личными сообщениями, ... с датой добавления больше суток (минимум). Если такое нашлось удаляем с сервера и потом при успешном удалении с ФС удаляем или помечаем удаленным в базе - deleted. При невозможности удаления - ставим статус delError и уведомляем админа.
А как определять что статья добавлена? Ведь id темы еще не существует на момент публикации, или мне его где то закладывать после передавать в момент создании темы?

Я думал сделать так, генерирую чисто случайное число которые будет складываться, день+месяц+год+час+минута+секунда+идПользователя и при загрузке картинок сразу писать информацию в БД в этим самым ИД ну и при создании темы брать последний id темы и писать сразу же генерируемое число. но думал что бред.
 
Последнее редактирование модератором:
Создание статьи и загрузка картинок, это 2 разных класса. Соответственно надо наладить их взаимодействие через ивенты, например.

Ну или проще.
Всё это приходит от пользователя и не одновременно и может быть даже, что один делает сразу несколько статей, значит нам еще и некое хранилище надо делать привязку к вкладке:
При нажатии кнопки создать статью, генерируешь уникальный идентификатор, который передаешь клиенту.
При загрузке картинке получаешь этот идентификатор и хранишь его где-то со всеми полученными по нему картинками (сессия, бд).
При нажатии опубликовать, мы получаем текст статьи и идентификатор и теперь можем заполнить таблицу связи картинка то статья.
 
  • Нравится
Реакции: NOIP
Создание статьи и загрузка картинок, это 2 разных класса. Соответственно надо наладить их взаимодействие через ивенты, например.

Ну или проще.
Всё это приходит от пользователя и не одновременно и может быть даже, что один делает сразу несколько статей, значит нам еще и некое хранилище надо делать привязку к вкладке:
При нажатии кнопки создать статью, генерируешь уникальный идентификатор, который передаешь клиенту.
При загрузке картинке получаешь этот идентификатор и хранишь его где-то со всеми полученными по нему картинками (сессия, бд).
При нажатии опубликовать, мы получаем текст статьи и идентификатор и теперь можем заполнить таблицу связи картинка то статья.
Так и реализовал! спасибо.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху