Этот сайт не наркоманов. Это сайт программистов.

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Пыха переехала на новый сервер, ура!

Краснодарское время: 23 Май, 2012, 05:48:07

Страниц: [1] 2
Печать
Автор Тема: Хранение изображений в базе данных MySQL  (Прочитано 6450 раз)
0 Пользователей и 1 Гость смотрят эту тему.
maxfr    ↓ 
02 Апрель, 2009, 12:17:27
НЕ ХУЕТА! ХУЕТА!


Карма: 0
Сообщений: 546
Сила слова: 0

Для хранения изображений в базе данных MySQL необходимо определить одно из полей таблицы как производное от типа BLOB. Сокращение BLOB означает большой двоичный объект. Тип хранения данных BLOB обладает несколькими вариантами:
 
   * TINYBLOB - может хранить до 255 байт
   * BLOB - может хранить до 64 килобайт информации
   * MEDIUMBLOB - до 16 мегабайт
   * LONGBLOB - до 4 гигабайт
 
Соответсвенно, для хранения изображений нам надо создать таблицу images с двумя полями:
 
   * id - уникальный ID изображения
   * content - поле для хранения изображения
 
Для сохранения файла изображения в базе данных необходимо прочитать файл в переменную и создать запрос на добавление данных в таблицу.
Итак поехали, index.php
PHP

<?php
// Соединяемся с сервером БД
mysql_connect ( 'localhost', 'root', '' );
mysql_query( 'SET NAMES cp1251' );
mysql_select_db ( 'images' );
 
if( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
  // Проверяем пришел ли файл
  if( !empty( $_FILES['image']['name'] ) ) {
    // Проверяем, что при загрузке не произошло ошибок
    if ( $_FILES['image']['error'] == 0 ) {
      // Если файл загружен успешно, то проверяем - графический ли он
      if( substr($_FILES['image']['type'], 0, 5)=='image' ) {
        // Читаем содержимое файла
        $image = file_get_contents( $_FILES['image']['tmp_name'] );
        // Экранируем специальные символы в содержимом файла
        $image = mysql_escape_string( $image );
        $title = mysql_escape_string( $_POST['title'] );
        // Формируем запрос на добавление файла в базу данных
        $query="INSERT INTO `images` VALUES(NULL, '".$title."', '".$image."')";
        // После чего остается только выполнить данный запрос к базе данных
        mysql_query( $query );
      }
    }
  }
}
?>
<html>
<head>
<title>Загрузка изображений</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>
<h3>Загруженные изображения</h3>
<p>
<?php
$query = "SELECT id, title FROM images WHERE 1 ORDER BY id";
$res = mysql_query( $query );
while( $img = mysql_fetch_array( $res ) ) {
  echo '<img src="image.php?id='.$img['id'].'" alt="'.$img['id'].'" />';
}
?>
</p>
<form enctype="multipart/form-data" method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>">
Наименование: <input type="text" name="title" value="" /><br/>
Изображение: <input type="file" name="image" /><br/>
<input type="submit" value="Загрузить" />
</form>
</body>
</html>

image.php
 
PHP
<?php
// Соединяемся с сервером БД
mysql_connect ( 'localhost', 'root', '' );
mysql_query( 'SET NAMES cp1251' );
mysql_select_db ( 'images' );
 
if ( isset( $_GET['id'] ) ) {
  // Здесь $id номер изображения
  $id = (int)$_GET['id'];
  if ( $id > 0 ) {
    $query = "SELECT `content` FROM `images` WHERE `id`=".$id;
    // Выполняем запрос и получаем файл
    $res = mysql_query($query);
    if ( mysql_num_rows( $res ) == 1 ) {
      $image = mysql_fetch_array($res);
      // Отсылаем браузеру заголовок, сообщающий о том, что сейчас будет передаваться файл изображения
      header("Content-type: image/*");
      // И  передаем сам файл
      echo $image['content'];
    }
  }
}
?>

Вот и дамп таблицы images.
 
CREATE TABLE `images` (
 `id` int(11) NOT NULL auto_increment,
 `title` varchar(255) NOT NULL,
 `content` blob NOT NULL default '',
 PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;
Записан

Все грамматические ошибки являются авторским стилем изложения материала.©
md5    ↓ 
02 Апрель, 2009, 12:20:06 , спустя 2 минуты 39 секунд
НЕ ХУЕТА! ХУЕТА!

выезд, апартаменты, массаж, стриптиз, подружки, дорого
Группа: в ухо

Карма: не нужна
Сообщений: 10494
Сила слова: 1.19

нахуй надо хранить изображения в базе
ояебу, я опиздошен
Записан

8: Undefined variable: str
Файл: /home/pyha/pyha.ru/forum/bbcode/Xbb/Tags/Man.php
Строка: 18
adw0rd: мудень блять, я уже фиксить стал эту фигню :)
md5: вуахахахаха
maxfr    ↓ 
02 Апрель, 2009, 12:27:37 , спустя 7 минут 31 секунду
НЕ ХУЕТА! ХУЕТА!


Карма: 0
Сообщений: 546
Сила слова: 0


нахуй надо хранить изображения в базе
ояебу, я опиздошен
Статья выложена для общего развития.
 
ИМХО: способ правда ебуч***. ПхпМуАдмин грузится очень долго.
Записан

Все грамматические ошибки являются авторским стилем изложения материала.©
adw0rd    ↓ 
02 Апрель, 2009, 12:29:17 , спустя 1 минуту 40 секунд
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17615
Сила слова: 1.67


нахуй надо хранить изображения в базе
ояебу, я опиздошен

Не всегда это так плохо, как кажется.
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
CTAPbIu_MABP    ↓ 
02 Апрель, 2009, 12:33:01 , спустя 3 минуты 44 секунды
НЕ ХУЕТА! ХУЕТА!

мавр
Группа: в ухо

Карма: не нужна
Сообщений: 5187
Сила слова: 1.81

у оракла достук к своим данным быстрее чем у файловой системы ос
Записан

java.lang.OutOfMemoryError
CTAPbIu_MABP    ↓ 
02 Апрель, 2009, 12:33:24 , спустя 23 секунды
НЕ ХУЕТА! ХУЕТА!

мавр
Группа: в ухо

Карма: не нужна
Сообщений: 5187
Сила слова: 1.81

это я о том что если хранить картинки в бд оракла то это не так уж плохо
Записан

java.lang.OutOfMemoryError
AlexB    ↓ 
02 Апрель, 2009, 12:51:10 , спустя 17 минут 46 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 89
Сообщений: 3423
Сила слова: 2.6


нахуй надо хранить изображения в базе
Я могу рассказать такую историю. Мы делали интранет для одной компании. Основной функцией было хранение корпоративных документов и поиск по ним. В основном документы были понятное дело в формате ворд, эксель, повер поинт. Так вот, при хранении их внутри MS-SQL-ных блобов СУБД умеет строить по ним фулл-текст индекс. Таким образом, казалось бы неразрешимая, проблема поиска по бинарникам решается крайне просто. (Правда с PDF мы задачу так и не разрешили, хотя какие-то средства для сторонних форматов там тоже декларируются, подробностей не помню)
 
Для мускула я пока с такой необходимость не сталкивался, но теоритически тоже можно найти причину. Например репликация базы на slave сервера.
« Последнее редактирование: 02 Апрель, 2009, 12:54:30 от AlexB » Записан

Patrick    ↓ 
02 Апрель, 2009, 12:56:22 , спустя 5 минут 12 секунд
НЕ ХУЕТА! ХУЕТА!
Группа: Жмурики

Карма: 8
Сообщений: 506
Сила слова: 1.58

CTAPbIu_MABP, сам тестил?
фак как НЕ надо хранить данные в БД
Записан

Patrick    ↓ 
02 Апрель, 2009, 12:58:26 , спустя 2 минуты 4 секунды
НЕ ХУЕТА! ХУЕТА!
Группа: Жмурики

Карма: 8
Сообщений: 506
Сила слова: 1.58

AlexB, а не проще было парсить доки и строить индекс тем же сфинксом
Записан

AlexB    ↓ 
02 Апрель, 2009, 01:02:17 , спустя 3 минуты 51 секунду
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 89
Сообщений: 3423
Сила слова: 2.6

А чем их парсить?
 
А про sphinx мы тогда не знали (он кстати когда появился? да и там MS был полюбому), это вообще дело давнее и наверно было дофига архитектурных косяков, просто привел как пример осмыслленного выбора хранения файлов в БД.
« Последнее редактирование: 02 Апрель, 2009, 01:05:07 от AlexB » Записан

Givi    ↓ 
02 Апрель, 2009, 01:03:43 , спустя 1 минуту 26 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 42
Сообщений: 2305
Сила слова: 1.82

AlexB, думаю что и с файловой системой репликацию можно сделать (если я правильно понимаю что такое репликация в твоем примере).
А в целом ФС удобнее тем, что можно имаги хранить отдельной пачкой, и можно с ними на физическом уровне делать что угодно, не прибегая к нагрузке (выборка из базы) БД. Конечно же, не для всех задач. Просто мой ИМХО - хранение в картинок БД это отстой.
 
п.с. О репликации вообще знаю очень мало, так как с этим пока работать не приходилось.
п.с.2 У нас есть одна база, где храняться данные юзверей + пароли. Так вот пароли храняться в БЛОБе. Типа через ПМА не видно, работать с ними (паролями) неудобно. А в целом они не хешированные, а открытые текстовые файлики. Просто программист когда это писал, был ещё очень зеленым. Да и было это давно, а переделывать никто не хочет.
Записан

Все, что говорят другие - неправда! До тех пор, пока ты сам в это не поверишь.
Если человек дурак, то... чур это не я!
AlexB    ↓ 
02 Апрель, 2009, 01:06:47 , спустя 3 минуты 4 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 89
Сообщений: 3423
Сила слова: 2.6


AlexB, думаю что и с файловой системой репликацию
да можно, можно. rsync называется. но вдруг, нужна точная синхронность? вообще я тут никакое решение не защищаю, просто примеры разных вариантов привожу.
Записан

Patrick    ↓ 
02 Апрель, 2009, 01:15:20 , спустя 8 минут 33 секунды
НЕ ХУЕТА! ХУЕТА!
Группа: Жмурики

Карма: 8
Сообщений: 506
Сила слова: 1.58

А чем их парсить?
либы думаю есть эт не проблема
Записан

adw0rd    ↓ 
02 Апрель, 2009, 01:19:25 , спустя 4 минуты 5 секунд
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17615
Сила слова: 1.67

Patrick, ты работал с MS форматами офисных пакетов? Либы то есть, опять таки использующие OLE/COM и т.д., то же использует и MS SQL.
 
Вопрос, зачем писать сторонние решения, если это проще решить средствами самой СУБД? Тем более каждый раз когда что-то меняется в файла - надо заново индексировать... и добавлять в БД... Только гемор добавится...
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
md5    ↓ 
02 Апрель, 2009, 01:20:37 , спустя 1 минуту 12 секунд
НЕ ХУЕТА! ХУЕТА!

выезд, апартаменты, массаж, стриптиз, подружки, дорого
Группа: в ухо

Карма: не нужна
Сообщений: 10494
Сила слова: 1.19



нахуй надо хранить изображения в базе
ояебу, я опиздошен

Не всегда это так плохо, как кажется.
да нет ничего универсального, кто ж спорит

у оракла достук к своим данным быстрее чем у файловой системы ос
не вижу тут оракла
Записан

8: Undefined variable: str
Файл: /home/pyha/pyha.ru/forum/bbcode/Xbb/Tags/Man.php
Строка: 18
adw0rd: мудень блять, я уже фиксить стал эту фигню :)
md5: вуахахахаха
Страниц: [1] 2
Печать
 

Перейти в:  

Этот топик скрыли: adw0rd