Как хранить файлы в mysql

Обновлено: 01.05.2024

Чтобы экспортировать или импортировать с помощью MySQL, начните с входа на сервер, желательно с доступом sudo (root).

Экспорт из MySQL

Лучший инструмент для экспорта базы данных MySQL в текстовый файл — mysqldump .

Чтобы использовать mysqldump , вам необходимо знать учетные данные для входа в систему соответствующего пользователя MySQL, имеющего необходимые привилегии для экспорта рассматриваемой базы данных.

Имея эту информацию, введите команду mysqldump с соответствующими флагами и параметрами:

  • Флаг -u указывает, что за ним следует имя пользователя MySQL.
  • Флаг -p указывает, что у нас должен быть запрошен пароль, связанный с указанным выше именем пользователя.
  • database_name — это, конечно, точное имя экспортируемой базы данных.
  • Символ > — это директива Unix для STDOUT , которая позволяет командам Unix выводить текстовые результаты выполненной команды в другое место. В данном случае выходным местоположением является путь к файлу, заданный параметром output_file_path .

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

Например, чтобы экспортировать базу данных books от имени пользователя book_admin в каталог ~/backup/database, можно использовать следующую команду:

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

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

Импорт в MySQL

Теперь, когда вы узнали, как экспортировать резервную копию базы данных MySQL, мы рассмотрим, как выполнить обратный процесс и импортировать резервную копию в существующую базу данных.

Как вы можете себе представить, в дополнение к команде mysqldump, используемой для экспорта, есть аналогичная команда mysqlimport для импорта.

В большинстве случаев импорт заключается в передаче практически идентичных параметров команде mysqlimport. Чтобы импортировать созданный ранее сохраненный файл books.sql, мы использовали многие из тех же флагов и почти такой же синтаксис.

Как и прежде, для аутентификации требуются флаги -u и -p, за которыми следует имя базы данных для импорта (в данном случае мы используем другую производственную базу данных), а затем, наконец, указывается полный путь к файлу дампа SQL, содержащему наши данные импорта, ~/backup/database/books.sql . Также стоит отметить, что mysqlimport не требует символов или > (STDIN/STDOUT), которые использовались с mysqldump .

Благодаря этому вы узнали, как экспортировать/резервировать существующую базу данных, а также как затем импортировать/восстанавливать эти данные в ту же или даже в другую базу данных.

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

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

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

Плюсы хранения файлов в базе данных

  1. Консистенция ACID (атомарность, непротиворечивость, целостность, долговечность), включая откат обновления, что усложняется, когда файлы хранятся вне базы данных. Синхронизация файлов и базы данных и возможность участвовать в транзакциях могут быть очень полезными.
  2. Файлы идут вместе с базой данных и не могут быть изолированы от нее.
  3. Резервные копии автоматически включают двоичные файлы файлов.

Минусы хранения файлов в базе данных

  1. Размер двоичного файла зависит от базы данных.
  2. Хранение файлов в базе данных может сделать ее намного больше. Таким образом увеличивается размер базы данных. Уровень знаний, необходимых для обслуживания базы данных, возрастает пропорционально размеру базы данных, т. е. большие базы данных сложнее поддерживать, чем маленькие. Следовательно, это увеличивает затраты на обслуживание бизнеса.
  3. Большая база данных потребляет больше памяти, поскольку они пытаются загрузить в память как можно больше данных.
  4. Необходимо позаботиться о переносимости, если используются специфические функции системы, такие как объект FILESTREAM SQL Server, и в будущем вам потребуется перейти на другую систему баз данных.
  5. Проблемой может быть код, сохраняющий файлы в базе данных. Когда вы храните файлы в файловой системе, не требуется дополнительный слой для переноса/настройки/изменения исходного файла.
  6. Отдавать файлы на веб-сайт сложнее, потому что вам нужно написать обработчик для потоковой передачи двоичного файла из базы данных. Опять же, добавление обработчика не является невозможным, но добавляет сложности.
  7. Во многих случаях это приведет к раздуванию файлов базы данных и возникновению ряда проблем с производительностью. Если вы вставите BLOB-объекты в таблицу с большим количеством столбцов, будет еще хуже.

Предпосылки

Загрузить файлы и сохранить в MySQL

В этом примере файлы выбираются с помощью кнопок обзора, и файлы сохраняются в поле BLOB базы данных MySQL. PHP-скрипт сохраняет файлы в указанный столбец таблицы базы данных и возвращает ответ в виде сообщения об успешном выполнении от PHP-скрипта. В качестве шага проверки я добавил только проверку того, выбрали ли вы хотя бы один файл для загрузки или нет.

Это руководство даст вам дополнительную ссылку на вложение для загрузки файла, поэтому вы нажмете «Прикрепить другой файл», после чего вы получите кнопку «Выбрать файл», чтобы прикрепить другой файл. Если вы не хотите загружать выбранный файл, вы можете удалить прикрепленный файл, используя ссылку Удалить.

Приведенная ниже HTML-форма необходима для загрузки нескольких файлов:

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

Приведенный ниже PHP-код требуется для проверки и сохранения файлов в базе данных MySQL.

Таблица MySQL

Я создаю таблицу с именем files_data в базе данных roytuts на сервере MySQL.

Тестирование приложения

Когда вы запустите приведенный выше файл PHP, вы увидите следующую форму для загрузки файлов:

сохранять файлы в mysql, используя php

Когда файлы выбраны для загрузки:

сохранять загруженные файлы в mysql с помощью php

Когда файлы будут сохранены в базе данных MySQL, вы получите сообщение об успешном завершении.

сохранять загруженные файлы в mysql с помощью php

Если вы не выберете файл для загрузки и нажмете кнопку "Загрузить", появится сообщение об ошибке.

Исходный код

1 мысль о «Сохранение файлов в MySQL с помощью PHP»

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

Большой двоичный объект ( BLOB ) — это тип данных MySQL, который может хранить двоичные данные, такие как изображения, мультимедиа и файлы PDF.

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

Именно здесь на помощь приходит тип данных MySQL BLOB. Этот подход к программированию устраняет необходимость в создании отдельной файловой системы для хранения изображений. Эта схема также централизует базу данных, делая ее более переносимой и безопасной, поскольку данные изолированы от файловой системы. Создание резервных копий также упрощается, поскольку вы можете создать единый файл дампа MySQL, содержащий все ваши данные.

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

В этом руководстве вы будете использовать тип данных MySQL BLOB для хранения изображений с помощью PHP в Ubuntu 18.04.

Предпосылки

Чтобы следовать этому руководству, вам потребуется следующее:

  • Сервер Ubuntu 18.04, настроенный с помощью первоначальной настройки сервера с Ubuntu 18.04 и пользователем без полномочий root с привилегиями sudo.
  • Настройка Apache, MySQL и PHP в соответствии с руководством по установке стека Linux, Apache, MySQL, PHP (LAMP) в Ubuntu 18.04. Для этого руководства необязательно создавать виртуальные хосты, поэтому шаг 4 можно пропустить.

Шаг 1 — Создание базы данных

Вы начнете с создания образца базы данных для своего проекта. Для этого подключитесь к серверу по SSH, а затем выполните следующую команду, чтобы войти на сервер MySQL с правами root:

Введите пароль root вашей базы данных MySQL и нажмите ENTER, чтобы продолжить.

Затем выполните следующую команду, чтобы создать базу данных. В этом уроке мы назовем его test_company :

После создания базы данных вы увидите следующий вывод:

Затем создайте учетную запись test_user на сервере MySQL и не забудьте заменить PASSWORD надежным паролем:

Вы увидите следующий вывод:

Чтобы предоставить test_user полные права доступа к базе данных test_company, выполните:

Убедитесь, что вы получили следующий результат:

Наконец, очистите таблицу привилегий, чтобы MySQL перезагрузил разрешения:

Убедитесь, что вы видите следующий вывод:

Теперь, когда база данных test_company и test_user готовы, вы перейдете к созданию таблицы products для хранения образцов продуктов. Вы будете использовать эту таблицу позже для вставки и извлечения записей, чтобы продемонстрировать, как работает MySQL BLOB.

Выйдите из сервера MySQL:

Затем снова войдите в систему с учетными данными созданного вами пользователя test_user:

При появлении запроса введите пароль для пользователя test_user и нажмите ENTER, чтобы продолжить. Затем переключитесь на базу данных test_company, введя следующее:

После выбора базы данных test_company MySQL отобразит:

Затем создайте таблицу товаров, выполнив:

Эта команда создает таблицу с именем products . В таблице четыре столбца:

product_id : в этом столбце используется тип данных BIGINT, чтобы вместить большой список товаров, содержащий не более 2⁶³-1 позиций. Вы пометили столбец как PRIMARY KEY, чтобы однозначно идентифицировать продукты. Чтобы MySQL мог обрабатывать генерацию новых идентификаторов для вставленных столбцов, вы использовали ключевое слово AUTO_INCREMENT .

product_name : в этом столбце содержатся названия продуктов. Вы использовали тип данных VARCHAR, так как это поле обычно обрабатывает буквенно-цифровые символы длиной до 50 символов. Ограничение в 50 – это всего лишь гипотетическое значение, используемое в этом руководстве.

price . В демонстрационных целях таблица товаров содержит столбец цены, в котором хранится розничная цена товаров. Поскольку некоторые товары могут иметь плавающие значения (например, 23,69, 45,36, 102,99), вы использовали тип данных DOUBLE.

product_image : в этом столбце используется тип данных BLOB для хранения фактических двоичных данных изображений продуктов.

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

Выйдите из своего сервера MySQL:

Вы получите следующий вывод

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

Шаг 2. Создание PHP-скриптов для подключения и заполнения базы данных

На этом шаге вы создадите сценарий PHP, который будет подключаться к базе данных MySQL, созданной на шаге 1. Сценарий подготовит три примера продуктов и вставит их в таблицу продуктов.

Чтобы создать код PHP, откройте новый файл в текстовом редакторе:

Затем введите в файл следующую информацию и замените PASSWORD паролем test_user, созданным на шаге 1:

Сохраните и закройте файл.

В этом файле вы использовали четыре константы PHP для подключения к базе данных MySQL, созданной на шаге 1:

DB_NAME: эта константа содержит имя базы данных test_company.

DB_USER: эта переменная содержит имя пользователя test_user.

DB_PASSWORD: эта константа хранит ПАРОЛЬ MySQL учетной записи test_user.

DB_HOST : представляет сервер, на котором находится база данных. В этом случае вы используете сервер localhost.

Следующая строка в вашем файле инициирует объект данных PHP (PDO) и подключается к базе данных MySQL:

В конце файла вы установили пару атрибутов PDO:

  • ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION : этот атрибут указывает PDO создавать исключение, которое может быть зарегистрировано в целях отладки.
  • ATTR_EMULATE_PREPARES, false : этот параметр повышает безопасность, указывая ядру базы данных MySQL выполнять подготовку вместо PDO.

Вы добавите файл /var/www/html/config.php в два PHP-скрипта, которые затем создадите для вставки и извлечения записей соответственно.

Сначала создайте PHP-скрипт /var/www/html/insert_products.php для вставки записей в таблицу товаров:

Затем добавьте следующую информацию в файл /var/www/html/insert_products.php:

Сохраните и закройте файл.

Вверху файла вы включили файл config.php. Это первый файл, который вы создали для определения переменных базы данных и подключения к базе данных. Файл также инициирует объект PDO и сохраняет его в переменной $pdo.

Далее вы создали массив данных о продуктах, которые нужно вставить в базу данных.Помимо product_name и price , которые подготавливаются в виде строк и числовых значений соответственно, скрипт использует встроенную в PHP функцию file_get_contents для чтения изображений из внешнего источника и передачи их в виде строк в столбец product_image.

Затем вы подготовили оператор SQL и использовали PHP foreach <. >оператор для вставки каждого продукта в базу данных.

Чтобы выполнить файл /var/www/html/insert_products.php, запустите его в окне браузера, используя следующий URL-адрес. Не забудьте заменить your-server-IP на общедоступный IP-адрес вашего сервера:

После выполнения файла вы увидите сообщение об успешном завершении в браузере, подтверждающее вставку записей в базу данных.

Сообщение об успешном завершении вставки записей в базу данных< бр />

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

Шаг 3. Отображение информации о продуктах из базы данных MySQL

С информацией о продуктах и ​​изображениями в базе данных вы теперь собираетесь написать другой PHP-скрипт, который запрашивает и отображает информацию о продуктах в таблице HTML в вашем браузере.

Чтобы создать файл, введите следующее:

Затем введите в файл следующую информацию:

Сохраните изменения в файле и закройте его.

Здесь вы снова включили файл config.php для подключения к базе данных. Затем вы подготовили и выполнили оператор SQL с использованием PDO для извлечения всех элементов из таблицы продуктов с помощью команды SELECT * FROM products.

Далее вы создали HTML-таблицу и заполнили ее данными о продуктах с помощью функции PHP while() <. > заявление. Строка $row = $stmt->fetch(PDO::FETCH_ASSOC) запрашивает базу данных и сохраняет результат в переменной $row в виде многомерного массива, который затем отображается в столбце таблицы HTML с помощью $row[ синтаксис 'имя_столбца'].

Изображения из столбца product_image заключены в теги. Вы использовали атрибуты ширины и высоты, чтобы уменьшить размер изображений до размера, который может поместиться в столбце таблицы HTML.

Чтобы преобразовать данные, содержащиеся в типе данных BLOB, обратно в изображения, вы использовали встроенную функцию PHP base64_encode и следующий синтаксис для схемы Data URI:

В этом случае image/png — это media_type, а строка в кодировке Base64 из столбца product_image — это base_64_encoded_data .

Затем запустите файл display_products.php в веб-браузере, введя следующий адрес:

После запуска файла display_products.php в браузере вы увидите HTML-таблицу со списком продуктов и связанных с ними изображений.

Список продуктов из базы данных MySQL
< /p>

Это подтверждает, что скрипт PHP для получения изображений из MySQL работает должным образом.

Заключение

В этом руководстве вы использовали тип данных MySQL BLOB для хранения и отображения изображений с помощью PHP в Ubuntu 18.04. Вы также увидели основные преимущества хранения изображений в базе данных по сравнению с их хранением в файловой системе. К ним относятся портативность, безопасность и простота резервного копирования. Если вы создаете приложение, такое как портал для студентов или базу данных сотрудников, для которого требуется совместное хранение информации и связанных изображений, эта технология может вам очень пригодиться.

Дополнительную информацию о поддерживаемых типах данных в MySQL см. в руководстве по типам данных MySQL. Если вам интересно узнать больше о MySQL и PHP, ознакомьтесь со следующими руководствами:

Хотите узнать больше? Присоединяйтесь к сообществу DigitalOcean!

Присоединяйтесь к нашему сообществу DigitalOcean, насчитывающему более миллиона разработчиков, бесплатно! Получайте помощь и делитесь знаниями в нашем разделе "Вопросы и ответы", находите руководства и инструменты, которые помогут вам расти как разработчику и масштабировать свой проект или бизнес, а также подписывайтесь на интересующие вас темы.

В этой главе представлен альтернативный способ работы с MySQL в качестве хранилища документов, который иногда называют «использованием NoSQL». Если вы намерены использовать MySQL традиционным (SQL) способом, эта глава, вероятно, вам не подходит.

Традиционно реляционные базы данных, такие как MySQL, обычно требуют определения схемы перед сохранением документов. Функции, описанные в этом разделе, позволяют вам использовать MySQL в качестве хранилища документов, которое представляет собой систему хранения документов без схемы и, следовательно, с гибкой схемой. Например, при создании документов, описывающих товары, вам не нужно знать и определять все возможные атрибуты любых товаров перед тем, как хранить документы и работать с ними.Это отличается от работы с реляционной базой данных и хранения продуктов в таблице, когда все столбцы таблицы должны быть известны и определены до добавления каких-либо продуктов в базу данных. Функции, описанные в этой главе, позволяют вам выбрать способ настройки MySQL, используя только модель хранилища документов или сочетая гибкость модели хранилища документов с мощью реляционной модели.

Чтобы использовать MySQL в качестве хранилища документов, используйте следующие функции сервера:

Подключаемый модуль X позволяет MySQL Server взаимодействовать с клиентами с использованием протокола X, что является необходимым условием для использования MySQL в качестве хранилища документов. Плагин X включен по умолчанию в MySQL Server начиная с MySQL 8.0. Инструкции по проверке установки подключаемого модуля X, а также по настройке и мониторингу подключаемого модуля X см. в Разделе 20.5, «Плагин X».

Протокол X поддерживает операции CRUD и SQL, аутентификацию через SASL, позволяет выполнять потоковую передачу (конвейерную обработку) команд и расширяется на уровне протокола и уровня сообщений. Клиенты, совместимые с протоколом X, включают MySQL Shell и MySQL 8.0 Connectors.

Клиенты, взаимодействующие с сервером MySQL с помощью протокола X, могут использовать X DevAPI для разработки приложений. X DevAPI предлагает современный программный интерфейс с простой, но мощной конструкцией, обеспечивающей поддержку общепринятых отраслевых стандартных концепций. В этой главе объясняется, как начать работу с реализацией X DevAPI на JavaScript или Python в MySQL Shell в качестве клиента. Подробные руководства по использованию X DevAPI см. в Руководстве пользователя X DevAPI.

Читайте также: