Эффективно ли хранить изображения в формате base64 в базе данных?

Как изменить способ сохранения изображений для статей в Laravel Backpack, избегая хранения их в БД в виде Base64? Имеет ли смысл использовать LONG TEXT поле в БД для хранения изображений, учитывая, что их размер колеблется в пределах 2-4 МБ, а максимальный размер - 10 МБ?
  • 25 июня 2024 г. 14:42
Ответы на вопрос 2
Хранение изображений в базе данных в формате base64 не является оптимальным решением, так как это увеличивает размер базы данных и замедляет доступ к данным изображений. Рекомендуется хранить изображения на сервере или в облачном хранилище, а в базе данных хранить ссылки или пути к этим изображениям.

Для изменения способа сохранения изображений для статей в Laravel Backpack можно воспользоваться пакетами для управления файлами, такими как Laravel Filesystem. Можно создать отдельную таблицу для хранения путей к изображениям, а затем загружать изображения на сервер и сохранять их путь в базе данных.

Использование LONG TEXT поля в базе данных для хранения изображений с размером от 2 до 4 МБ является возможным, но не самым эффективным. Рекомендуется использовать тип данных BLOB для хранения бинарных данных, таких как изображения. Если размер изображения не превышает 10 МБ, то BLOB должен быть достаточным для хранения изображения в базе данных. Однако, для лучшей производительности и масштабируемости рекомендуется хранить изображения на сервере и ссылаться на них из базы данных.
Стоит ли хранить изображения base64 в БД?

нет

composer require symfony/dom-crawler

use Symfony\Component\DomCrawler\Crawler;
use Illuminate\Support\Facades\Storage;
use Illuminate\Http\File;

$desc = $request->input('some_html'); // POST with html
$dom_desc = new Crawler($desc);
$images = $dom_desc->filterXPath('//img')->extract(array('src')); // extract images
 
foreach ($images as $key => $value) {
    if (strpos($value, 'base64') !== false) { // leave alone not base64 images
        $data = explode(',', $value); // split image mime and body
        $tmp_file = tempnam('/tmp', 'items'); // create tmp file path
        file_put_contents($tmp_file, base64_decode($data[1])); // fill temp file with image
        $path = Storage::putFile('public/items', new File($tmp_file)); // put file to final destination
        $desc = str_replace($value, $path, $desc); // replace src of converted file to fs path
        unlink($tmp_file); // delete temp file
    }
}
Похожие вопросы