257

キャンバスの描画を PNG 画像に変換するために、Nihilogic の「Canvas2Image」JavaScript ツールを使用しています。ここで必要なのは、このツールが生成する base64 文字列を、PHP を使用してサーバー上の実際の PNG ファイルに変換することです。

要するに、私が現在行っていることは、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」はdata:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABE...のようなデータ ブロックを受け取ります。

この時点から、私はかなり困惑しています。私が読んだことから、PHPのimagecreatefromstring関数を使用することになっていると思いますが、base64でエンコードされた文字列から実際のPNG画像を実際に作成してサーバーに保存する方法がわかりません. 助けてください!

4

16 に答える 16

504

その文字列からbase64画像データを抽出し、デコードしてからディスクに保存する必要があります。GDはすでにpngであるため、GDは必要ありません。

$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 = str_replace( ' ', '+', $data );
    $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);
于 2012-07-16T19:55:25.340 に答える
139

これを試して:

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

file_put_contents ドキュメント

于 2012-07-16T19:52:33.183 に答える
53

これを機能させるには、スペースをプラス記号に置き換える必要があり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);

それが役立つことを願っています。

于 2014-03-03T13:21:41.037 に答える
23

議論されたトピックは RFC 2397 - The "data" URL scheme ( https://www.rfc-editor.org/rfc/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);
于 2016-05-18T11:36:25.417 に答える
11

上記の解決策は、画像が jpeg ファイルであることに依存します。私が使用した一般的な解決策について

$img = $_POST['image'];
$img = substr(explode(";",$img)[1], 7);
file_put_contents('img.png', base64_decode($img));
于 2015-01-18T22:18:40.637 に答える
4

これを試して...

$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));
于 2014-09-23T07:18:14.473 に答える
1

PHP はすでにbase64 を公平に扱っています -> ファイル変換

私はこの方法を使用してそれを成し遂げるために使用します:

$blob=$_POST['blob']; // base64 coming from an url, for example

//Now, let's save the image file:

file_put_contents('myfile.png',file_get_contents($blob));
于 2020-04-14T16:08:57.517 に答える
0

それは簡単です :

js フレームワーク、ajax リクエスト、またはモバイル アプリケーション (クライアント側) 内でファイルをアップロードしようとしているとします。

  1. まず、base64 でエンコードされた文字列を含むデータ属性を送信します。
  2. サーバー側では、それをデコードしてローカル プロジェクト フォルダーに保存する必要があります。

ここでPHPを使用してそれを行う方法

<?php 

$base64String = "kfezyufgzefhzefjizjfzfzefzefhuze"; // I put a static base64 string, you can implement you special code to retrieve the data received via the request.

$filePath = "/MyProject/public/uploads/img/test.png";

file_put_contents($filePath, base64_decode($base64String));

?>
于 2019-01-06T10:14:48.247 に答える