php

Сохранить картинку как файл из base64 на PHP

При разработке веб-приложений нередко возникает задача сохранить изображение, которое передаётся не как загруженный файл, а как строка в формате Base64. Такой подход используется повсеместно: AJAX-загрузчики изображений, ответы внешних API, обработка данных с canvas, работа с веб-камерой в браузере. В этих случаях нужно декодировать строку и записать результат в файл на сервере средствами PHP.

Что такое Base64-строка изображения

Base64 — это способ кодирования бинарных данных в текстовый формат, использующий 64 символа ASCII. Изображение в формате Base64 обычно выглядит так:

Строка состоит из двух частей, разделённых запятой:

  • Префиксdata:image/jpeg;base64 — указывает MIME-тип и метод кодирования
  • Данные — собственно закодированное содержимое файла

При сохранении в файл нужна только вторая часть — данные после запятой. Префикс предназначен для браузера (он позволяет отображать изображение без скачивания файла) и при декодировании не нужен.

Базовый код для сохранения Base64-изображения

Вот простой и рабочий код, который решает задачу в несколько строк:

Разбор кода по строкам

  • str_contains($base64_string, ',') — проверяет, есть ли в строке префикс. Иногда Base64 передаётся уже без префикса (только данные), и тогда explode не нужен
  • explode(',', $base64_string) — разбивает строку по запятой. list(, $base64_string) — берём только второй элемент массива (после запятой), игнорируя первый (префикс)
  • base64_decode($base64_string) — декодирует текстовую строку обратно в бинарные данные изображения
  • file_put_contents($file_path, $image_data) — записывает бинарные данные в файл. Возвращает количество записанных байт или false при ошибке

Автоматическое определение типа файла и расширения

Если вы не знаете заранее, какой формат изображения придёт — можно извлечь тип из префикса Base64-строки и подобрать расширение автоматически:

Проверка размера и валидности изображения

Перед сохранением стоит убедиться, что данные не слишком большие и действительно являются изображением:

Безопасность при сохранении загружаемых изображений

Никогда не доверяйте данным, полученным от пользователя. При обработке Base64-изображений важно:

  • Проверять MIME-тип через finfo, а не только через префикс строки — пользователь может передать data:image/jpeg;base64, с PHP-кодом внутри
  • Не использовать имя файла из запроса — генерируйте имя файла на сервере через uniqid() или random_bytes()
  • Сохранять файлы вне web-root или в директорию без исполнения PHP, чтобы нельзя было выполнить загруженный файл как скрипт
  • Ограничивать допустимые расширения белым списком: ['jpg', 'jpeg', 'png', 'gif', 'webp']

Примеры использования

AJAX-загрузка изображения с canvas

Типичный сценарий: пользователь редактирует изображение в браузере (обрезка, поворот), JavaScript конвертирует результат через canvas.toDataURL() и отправляет Base64 на сервер через AJAX. PHP принимает строку через $_POST['image'] или JSON и сохраняет файл описанным выше методом.

Обработка ответа внешнего API

Некоторые API (например, генераторы изображений, сервисы обработки документов) возвращают изображение прямо в теле ответа в формате Base64. В этом случае PHP получает строку через file_get_contents() или cURL, декодирует JSON и сохраняет изображение на диск для дальнейшей обработки или показа пользователю.