Я использую инструмент Canvas2Image от Nihilogic для преобразования рисунков холста в изображения PNG. Теперь мне нужно превратить те строки base64, которые генерирует этот инструмент, в настоящие файлы PNG на сервере с использованием PHP.
Короче говоря, сейчас я создаю файл на стороне клиента с помощью Canvas2Image, затем извлекаю данные в кодировке base64 и отправляю их на сервер с помощью AJAX:
// Generate the image file
var image = Canvas2Image.saveAsPNG(canvas, true);
image.id = "canvasimage";
canvas.parentNode.replaceChild(image, canvas);
var url = 'hidden.php',
data = $('#canvasimage').attr('src');
$.ajax({
type: "POST",
url: url,
dataType: 'text',
data: {
base64data : data
}
});
В этот момент «hidden.php» получает блок данных, который выглядит как данные: image / png; base64, iVBORw0KGgoAAAANSUhEUgAABE ...
С этого момента я в значительной степени озадачен. Из того, что я прочитал, я считаю, что я должен использовать PHP- функцию imagecreatefromstring , но я не уверен, как на самом деле создать фактическое изображение PNG из строки в кодировке base64 и сохранить его на моем сервере. Пожалуйста, помогите!
источник
Ответы:
Вам нужно извлечь данные изображения base64 из этой строки, декодировать их, а затем вы можете сохранить их на диск, вам не нужен GD, поскольку он уже является png.
И как однострочник:
Эффективный метод извлечения, декодирования и проверки ошибок:
источник
$type
получает значение из разнесения , в зависимости от того, являются ли они данными: image / jpg или data: image / png и т. Д.Попробуй это:
file_put_contents docs
источник
data:image/png;base64,
что нарушает файл.data:image/png;base64,
строку, то передаваемая строка неbase64_decode
является действительной base64. Вам нужно только отправить данные, что иллюстрирует ответ drew010. С этим ответом ничего не нарушено. Вы не можете копировать и вставлять без понимания и ожидать, что это «просто сработает».Мне пришлось заменить пробелы на символы плюс,
str_replace(' ', '+', $img);
чтобы это работало.Вот полный код
Надеюсь, это поможет.
источник
$img = str_replace(' ', '+', $img);
мне очень помогла, спасибо! Почему я должен преобразовать пробел в "+" раньше?Стоит сказать, что обсуждаемая тема задокументирована в RFC 2397 - Схема URL «данных» ( https://tools.ietf.org/html/rfc2397 ).
Из-за этого в PHP есть собственный способ обработки таких данных - «data: stream wrapper» ( http://php.net/manual/en/wrappers.data.php )
Таким образом, вы можете легко манипулировать своими данными с потоками PHP:
источник
preg_replace
+file_put_contents
?Ваше решение выше зависит от того, является ли изображение JPEG-файлом. Для общего решения я использовал
источник
Приняв идею @ dre010, я расширил ее до другой функции, которая работает с любым типом изображения: PNG, JPG, JPEG или GIF и дает уникальное имя имени файла
Функция разделения данных изображения и типа изображения
источник
Всего проблем:
источник
Однолинейное решение.
источник
на основе примера drew010 я сделал рабочий пример для легкого понимания.
источник
попробуй это...
источник
Этот код работает для меня, проверьте код ниже:
источник
Эта функция должна работать. у него есть параметр photo, который содержит строку base64, а также путь к существующему каталогу изображений, если у вас уже есть существующее изображение, которое вы хотите удалить, пока вы сохраняете новое.
источник
Это просто :
Представим, что вы пытаетесь загрузить файл в рамках js, ajax-запроса или мобильного приложения (на стороне клиента).
Вот как это сделать с помощью PHP
источник
Если вы хотите случайным образом переименовать изображения и сохранить путь к изображению в базе данных в виде большого двоичного объекта и само изображение в папках, это решение поможет вам. Пользователи вашего сайта могут хранить столько изображений, сколько они хотят, в то время как изображения будут случайным образом переименованы в целях безопасности.
Код php
Генерация случайных вариантов для использования в качестве имени изображения.
Получить расширение данных изображения и часть base_64 (часть после данных: image / png; base64,) из изображения.
источник
PHP уже справедливо обрабатывает base64 -> преобразование файлов
Я использую, чтобы сделать это, используя этот способ:
источник