Сохранение изображений в базе данных MySQL

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

Прежде всего, Вы должны создать новую базу данных, для хранения бинарных данных. Для примера используется следующая таблица. Зайдите в phpMyAdmin, скопируйте и вставьте ниже приведённый код:

CREATE TABLE binary_data (
id INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY,
description CHAR(50),
bin_data LONGBLOB,
filename CHAR(50),
filesize CHAR(50),
filetype CHAR(50)
);

Пример php скрипта для сохранения данных в базе данных

Скрипт store.php сохраняет изображение в базу данных переданное через html форму.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <title>Сохранение бинарных данных в базе данных MySQL</title>
</head>
<body>
<?php

// Код, который будет выполняться, если форма была оправлена:
if ($_POST['submit']) {

    // подключение к базе данных
    // (возможно, вам придется настроить имя хоста, имя пользователя и пароль)
    $dbh = new mysqli("localhost", "root", "", "imagesstore");

    if (mysqli_connect_errno()) {
        exit("Ошибка подключения к базе данных MySQL: Сервер база данных не доступен!<br>
        Проверте параметры подключения к базе данных.");
    }

    $data = addslashes(fread(fopen($_FILES['file']['tmp_name'], "r"),
        filesize($_FILES['file']['tmp_name'])));

    $_POST['form_description'] = trim($_POST['form_description']);
    $size = filesize($_FILES['file']['tmp_name']);

    $result = $dbh->prepare("INSERT INTO binary_data (description,bin_data,filename,filesize,filetype) 
  " . "VALUES ('" . $_POST['form_description'] . "',
  '" . $data . "',
  '" . $_FILES["file"]["name"] . "',
  '" . $size . "',
  '" . $_FILES["file"]["type"] . "')");

    if (!$result) exit("Ошибка выполнения SQL запроса!");

    $result->execute();
    $id = $dbh->prepare();

    echo "<p>Этот файл имеет следующий идентификатор (ID) в базе данных: <b>" . $id . "</b>";

} else {

    // отображаем форму для оправки новых данных:
    ?>
    <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data">
        Описание файла: <input type="text" name="form_description" size="40">
        <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
        Файл для загрузки/хранения в базе данных: <input type="file" name="file" size="40">
        <p><input type="submit" name="submit" value="Отправить">
    </form>
    <?php

}

?>
</body>
</html>

При выполнении скрипта Вы увидите простую html форму. Для выбора файла (например, изображение) используйте кнопку «Обзор». Затем нажмите кнопку «Отправить». После загрузки файла на веб-сервер скрипт сообщит вам его идентификатор базы данных (ID). ID необходим для получения доступа к информации (при помощи следующего скрипта). Пример php скрипта для вывода изображений в браузер Скрипт getdata.php – это пример скрипта, который извлекает двоичную информацию из базы данных и передает её непосредственно пользователю. getdata.php

Поскольку скрипту необходимо «знать», который файл извлекать, в качестве параметра необходимо указать его ID. Например: Файл сохранен в базе данных под ID 2. Для получения этого файла необходимо вызвать:

getdata.php?id=2

Если в базе данных сохранены изображения, на вашей веб-странице можно использовать скрипт getdata, как например : Например: В базе данных вы сохранили изображение как ID 3 и хотите, чтобы оно отобразилось на вашей веб-странице. Для этого воспользуйтесь следующим кодом:

<?php

if (!preg_match("|^[\d]*$|", $_GET['id'])) exit();

// подключение к базе данных
// (возможно, вам придется настроить имя хоста, имя пользователя и пароль)
$dbh = new mysqli("localhost", "root", "", "imagesstore");

if (mysqli_connect_errno()) {
    exit("Ошибка подключения к базе данных MySQL: Сервер база данных не доступен!<br>
  Проверте параметры подключения к базе данных.");
}

$query = "SELECT bin_data,filetype from binary_data WHERE id=" . $_GET['id'];
$result = $dbh->query($query);

if (!$result) exit("Ошибка выполнения SQL запроса!");

$row = $result->fetch_array();

Header("Content-type: " . $row['filetype'] . "");
echo $row['bin_data'];

Пару полезных советов.

Как сохранить файл, размер которого больше 2 Mб?

Для загрузки и сохранения файлов, чей размер превышает 2 Мб, необходимо внести несколько изменений в скрипт и php/sql настройки в связи с установленными по умолчанию ограничениями. Для хранения файлов размером 2 Мб следует сделать следующее:

Внесите изменения в скрипт store.php. Поменяйте значение MAX_FILE_SIZE на 24000000;

По умолчанию php позволяет передовать файлы размером не более 2 Мб. Необходимо изменить переменную максимального размера файла на 24M. Это можно сделать в php.ini в дириктиве setting upload_max_filesize или в .htaccess прописать строчку php_value upload_max_filesize 24M. В конфигурационных файле apache прописать LimitRequestBody 24000000.

По умолчанию в mysql можно импортировать файлы размером не более 2 Мб. Чтобы снять ограничения размера пакета в mysql, выполните слудующие действия. Откройте файл настройки my.ini, измените строчку innodb_additional_mem_pool_size = 24M

Чтобы изменения вступили в силу, перезагрузите веб сервер Apache и сервер базы данных MySQL.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *