[php]base64から画像に変換するWebサイトを簡単に作成してみた

php

前回、画像からbase64文字列に変換する処理をphpで書いてみたので、今回はbase64から画像に変換してダウンロードする処理を書いてみました。
base64_decodeの使い方の記載と、実際に変換して画像をダウンロードできるサイトのサンプルコードを載せています。

base64_decodeの使い方

第1引数にbase64エンコードされた文字列を渡すと、データが返ってきます。
簡単ですね…😆

$image = base64_decode($_POST['base64_image']); 

php docはこちら

base64から画像変換してダウンロードする

phpとhtmlに分けて記載してみました。実際のファイルは1つです。
動作する環境がこちらにあります。

html

タグ

<!DOCTYPE html>
<html lang="ja">
    <head>
        <title>base64 to image | codelike web tool</title>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
    </head>
    <body>
        <nav class="navbar navbar-dark bg-dark text-white">
            base64 to image
        </nav>
        <div class="container mt-3">
            <form method="post" action="./index.php">
                <div class="card">
                    <div class="card-header">
                        base64から画像変換してダウンロード
                    </div>
                    <div class="card-body">
                        <div class="form-group">
                            <input type="hidden" name="mode" value="decode" />
                            <textarea name="base64_image" class="form-control" rows="20"></textarea>
                            <input type="submit" class="mt-2 form-control btn btn-primary" value="送信" />
                        </div>
                    </div>
                </div>
            </form>
        </div>
    </body>
</html>

解説

画面はbootstrap4.5を読み込んで使って、作成しています。(5行目)
12行目で、formタグを書いて、methodはpostで、actionは”./index.php”を指定して同じファイルで処理するようにしています。

formで飛ばして処理をするデータとして、下記を用意しています。
・mode => 初期表示時など、意図してないところで動かないように用意しました。formからpostした時だけ、decodeが送信されます。(19行目)
・base64_image => テキストエリアに入力した、base64エンコードした画像の情報です。(20行目)

送信ボタン(21行目)を押すと、formのデータが送信されて処理が実行されます。

php

コード

<?php
function getExtension ($mime_type){
    $extensions = [
                    'image/jpeg' => 'jpeg',
                    'image/png' => 'png',
                    'image/gif' => 'gif',
                    'image/bmp' => 'bmp',
                  ];
    return $extensions[$mime_type];
}

if (isset($_POST["mode"]) && $_POST["mode"] == "decode" && $_POST['base64_image']) {
    // base64からimageに
    $image = base64_decode($_POST['base64_image']);

    // fileのmimeタイプ取得
    $finfo = new finfo(FILEINFO_MIME_TYPE);
    $mime_type = $finfo->buffer($image);

    // fileの拡張子取得
    $extension = getExtension($mime_type);

    // ファイルの一時保存
    $file_name = date('YmdHis')."_image.{$extension}";
    file_put_contents($file_name, $image);

    // ファイルをブラウザでダウンロード
    header('Content-Type: application/octet-stream');
    header('Content-Length: '.filesize($file_name));
    header('Content-disposition: attachment; filename="'.$file_name.'"');
    readfile($file_name);

    // ファイルの削除
    unlink($file_name);
}
?>

解説

最初の2〜10行目のgetExtensionはmimetypeから拡張子を取得する関数です。
12行目でmodeがdecodeで、base64エンコードされたテキストがあった場合のみ処理をするようにif文を入れています。

14行目で渡されたbase64テキストを使って、decodeして画像を作成しています。
17・18行目で画像からmimetypeを取得しています。

21行目で取得したmimetypeを使って、ファイルの拡張子を取得しています。

24・25行目でファイルを同じ階層に一時保存しています。
ファイル名は[現在の年月日時分秒_image.(取得した拡張子)]です。

28〜31行目でブラウザからダウンロードするようにheaderを書いて、readfileで内容を読み込んでいます。
処理が終わったら最後に一時保存ファイルをunlinkで削除しています。

動作確認

base64エンコードした文字列を入れて、送信すると…

画像がダウンロードされます…

正常に画像が開けることが確認できました。

コメント

タイトルとURLをコピーしました