file_put_contents сохранить поврежденное изображение [base64] [duplicate]

Например, команда Unix test использует аналогичные операторы. Perl также имеет такие же операторы, хотя и без ведущего дефиса.

Причина использования PowerShell для использования множителей, а не для символов для операторов сравнения, вероятно, заключается в том, что некоторые из часто используемых сравнений символы уже используются для других операций (= & nbsp; & rarr; & nbsp; назначение, > & nbsp; & rarr; & nbsp; перенаправление).

169
задан Andrei Oniga 16 July 2012 в 20:48
поделиться

12 ответов

Вам нужно извлечь данные изображения base64 из этой строки, декодировать его, а затем вы можете сохранить его на диск, вам не нужен GD, поскольку он уже является png.

$data = 'data:image/png;base64,AAAFBfj42Pj4';

list($type, $data) = explode(';', $data);
list(, $data)      = explode(',', $data);
$data = base64_decode($data);

file_put_contents('/tmp/image.png', $data);

И как однострочный:

$data = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $data));

Эффективный метод для извлечения, декодирования и проверки ошибок:

if (preg_match('/^data:image\/(\w+);base64,/', $data, $type)) {
    $data = substr($data, strpos($data, ',') + 1);
    $type = strtolower($type[1]); // jpg, png, gif

    if (!in_array($type, [ 'jpg', 'jpeg', 'gif', 'png' ])) {
        throw new \Exception('invalid image type');
    }

    $data = base64_decode($data);

    if ($data === false) {
        throw new \Exception('base64_decode failed');
    }
} else {
    throw new \Exception('did not match data URI with image data');
}

file_put_contents("img.{$type}", $data);
319
ответ дан drew010 20 August 2018 в 23:31
поделиться
  • 1
    В вашем примере есть тип $. Какая должна быть эта ценность? – Jon 11 February 2017 в 21:10
  • 2
    @Jon $type получает значение от взрыва, в зависимости от того, являются ли данные: image / jpg или data: image / png и т. Д. – drew010 16 February 2017 в 17:17
  • 3
    Я получил эту ошибку: неправильные символы utf-8, возможно, неправильно закодированы, что я должен делать? – aldo 2 July 2017 в 09:02
  • 4
    @aldo Возможно, задайте новый вопрос с кодом и детализацией. Довольно невозможно сказать, основываясь только на этом сообщении и не видя своего кода, не зная, как кодируется изображение и как его отправляют в скрипт. – drew010 5 July 2017 в 15:46

Ну, ваше решение выше зависит от того, что изображение является файлом jpeg. Для общего решения я использовал

$img = $_POST['image'];
$img = substr(explode(";",$img)[1], 7);
file_put_contents('img.png', base64_decode($img));
8
ответ дан Anextro 20 August 2018 в 23:31
поделиться

Мне пришлось заменить пробелы символами плюс str_replace(' ', '+', $img);, чтобы заставить это работать.

Вот полный код

$img = $_POST['img']; // Your data 'data:image/png;base64,AAAFBfj42Pj4';
$img = str_replace('data:image/png;base64,', '', $img);
$img = str_replace(' ', '+', $img);
$data = base64_decode($img);
file_put_contents('/tmp/image.png', $data);

Надеюсь, что это поможет.

32
ответ дан Ben 20 August 2018 в 23:31
поделиться
  • 1
    Ваша строка $img = str_replace(' ', '+', $img); мне очень помогла, спасибо! Почему мне нужно преобразовать пространство в & quot; + & quot; до? – Sven 16 August 2018 в 10:07

Однолинейное решение.

$base64string = 'data:image/png;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//Ub//ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExKcppV0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7';
file_put_contents('img.png', base64_decode(explode(',',$base64string)[1]));
2
ответ дан bfcior 20 August 2018 в 23:31
поделиться

Этот код работает для меня, чтобы проверить код ниже:

<?php
define('UPLOAD_DIR', 'images/');
$image_parts = explode(";base64,", $_POST['image']);
$image_type_aux = explode("image/", $image_parts[0]);
$image_type = $image_type_aux[1];
$image_base64 = base64_decode($image_parts[1]);
$file = UPLOAD_DIR . uniqid() . '.png';
file_put_contents($file, $image_base64);
?>
1
ответ дан gaurav daxini 20 August 2018 в 23:31
поделиться

попробуйте это ...

$file = $_POST['file']; //your data in base64 'data:image/png....';
$img = str_replace('data:image/png;base64,', '', $file);
file_put_contents('img/imag.png', base64_decode($img));
2
ответ дан Paline 20 August 2018 в 23:31
поделиться

Взял идею @ dre010, я распространил ее на другую функцию, которая работает с любым типом изображения: PNG, JPG, JPEG или GIF и дает уникальное имя для имени файла

Функция отдельных данных изображения и тип изображения

function base64ToImage($imageData){
    $data = 'data:image/png;base64,AAAFBfj42Pj4';
    list($type, $imageData) = explode(';', $imageData);
    list(,$extension) = explode('/',$type);
    list(,$imageData)      = explode(',', $imageData);
    $fileName = uniqid().'.'.$extension;
    $imageData = base64_decode($imageData);
    file_put_contents($fileName, $imageData);
}
8
ответ дан PolloZen 20 August 2018 в 23:31
поделиться

на основе примера drew010 Я сделал рабочий пример для легкого понимания.

imagesaver("data:image/jpeg;base64,/9j/4AAQSkZJ"); //use full base64 data 

function imagesaver($image_data){

    list($type, $data) = explode(';', $image_data); // exploding data for later checking and validating 

    if (preg_match('/^data:image\/(\w+);base64,/', $image_data, $type)) {
        $data = substr($data, strpos($data, ',') + 1);
        $type = strtolower($type[1]); // jpg, png, gif

        if (!in_array($type, [ 'jpg', 'jpeg', 'gif', 'png' ])) {
            throw new \Exception('invalid image type');
        }

        $data = base64_decode($data);

        if ($data === false) {
            throw new \Exception('base64_decode failed');
        }
    } else {
        throw new \Exception('did not match data URI with image data');
    }

    $fullname = time().$type;

    if(file_put_contents($fullname, $data)){
        $result = $fullname;
    }else{
        $result =  "error";
    }
    /* it will return image name if image is saved successfully 
    or it will return error on failing to save image. */
    return $result; 
}
0
ответ дан sanjeet bisht 20 August 2018 в 23:31
поделиться

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

 public function convertBase64ToImage($photo = null, $path = null) {
    if (!empty($photo)) {
        $photo = str_replace('data:image/png;base64,', '', $photo);
        $photo = str_replace(' ', '+', $photo);
        $photo = str_replace('data:image/jpeg;base64,', '', $photo);
        $photo = str_replace('data:image/gif;base64,', '', $photo);
        $entry = base64_decode($photo);
        $image = imagecreatefromstring($entry);

        $fileName = time() . ".jpeg";
        $directory = "uploads/customer/" . $fileName;

        header('Content-type:image/jpeg');

        if (!empty($path)) {
            if (file_exists($path)) {
                unlink($path);
            }
        }

        $saveImage = imagejpeg($image, $directory);

        imagedestroy($image);

        if ($saveImage) {
            return $fileName;
        } else {
            return false; // image not saved
        }
    }
}
-1
ответ дан Saviour Dela 20 August 2018 в 23:31
поделиться

Попробуйте следующее:

file_put_contents('img.png', base64_decode($base64string));

file_put_contents docs

103
ответ дан Some Guy 20 August 2018 в 23:31
поделиться
  • 1
    Я пробовал это, но он включает в себя data:image/png;base64,, который разбивает файл. – Michael J. Calkins 3 September 2013 в 20:13
  • 2
    @MichaelCalkins Прерывает его и для меня. Ответ drew010 кажется единственным решением, которое работает последовательно. – David John Welsh 24 November 2013 в 05:21
  • 3
    Если вы включили data:image/png;base64,, то строка, которую вы переходите на base64_decode, недействительна base64. Вам нужно только отправлять данные, что и иллюстрирует ответ drew010. С этим ответом ничего не сломано. Вы не можете копировать и вставлять без понимания и ожидать, что это будет «просто работать». – Cypher 7 May 2014 в 21:51
  • 4
    Не работает для примера, представленного в вопросе, который не является базовым содержанием, и сначала должен быть разбит на части (см. Принятый ответ). – Benjamin Piette 26 May 2015 в 12:38
  • 5
    мое изображение успешно сохранено. но когда я пишу URL-адрес изображения, я вижу пустое изображение. Я уверен, что мой dataURL верен, потому что я тестировал это с помощью window.open (dataURL). Почему пустой образ? – partho 16 August 2015 в 05:02

Стоит сказать, что обсуждаемая тема документирована в RFC 2397 - Схема URL-адресов данных ( https://tools.ietf.org/html/rfc2397 )

Из-за этого PHP имеет собственный способ обработки таких данных - «data: stream wrapper» ( http://php.net/manual/en/wrappers.data.php )

Таким образом, вы можете легко манипулировать своими данными потоками PHP:

$data = 'data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//Ub//ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExKcppV0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7';

$source = fopen($data, 'r');
$destination = fopen('image.gif', 'w');

stream_copy_to_stream($source, $destination);

fclose($source);
fclose($destination);
9
ответ дан Vladimir Posvistelik 20 August 2018 в 23:31
поделиться
2
ответ дан Greg Schmidt 31 October 2018 в 18:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: