PHPでbase64から画像ファイルを保存する方法を現役エンジニアが解説【初心者向け】

初心者向けにPHPでbase64から画像ファイルを保存する方法について現役エンジニアが解説しています。base64とは、画像などのデータを64種類の英数字と記号で表現したものです。PHPで画像ファイルをbase64エンコードやデコードを行い保存する方法やファイルのMIMEタイプについて解説します。

TechAcademyマガジンは受講者数No.1のオンラインプログラミングスクールTechAcademy [テックアカデミー]が運営。初心者向けに解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。

PHPでbase64から画像ファイルを保存する方法について、TechAcademyのメンター(現役エンジニア)が実際のコードを使用して初心者向けに解説します。

そもそもPHPについてよく分からないという方は、PHPとは何なのか解説した記事を読むとさらに理解が深まります。

 

なお本記事は、TechAcademyのオンラインブートキャンプPHP/Laravel講座の内容をもとに紹介しています。

 

田島悠介

今回は、PHPに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

PHPでbase64から画像ファイルを保存する方法について詳しく説明していくね!

大石ゆかり

お願いします!

 
この記事では、PHPでbase64形式のデータを扱う方法を具体的なコードを見ながら解説していきます。
 

目次

 

base64とは

文字列、画像、オブジェクト、ファイルなど様々なデータを64種類の英数字と記号(a-z, A-Z, 0-9, +, /)で表現したものです。元々ASCII文字のテキストしか扱えなかったメール通信で画像などのバイナリデータを扱う為にASCII文字に変換する方式として導入されました。

少ない文字で表現しますので、元のデータよりも33%以上サイズが増えます。その特徴から、主にサイズの小さいデータを扱うことが多いです。
 

base64形式のメリット

base64処理を用いるメリットとしては、画像ファイルをbase64に変換すると文字列になりますので、サーバーにデータを送信する場合などに元のバイナリデータのままよりも、処理が単純になります。
また、base64エンコードされた画像はウェブページに直接埋め込むこともできます。これによって、HTTPリクエストの回数を減らす効果があります。

さらに、データを保存する場合も、文字列として扱えますので、データベースのテキストフィールドにそのまま保存できます。
 

[PR] PHPプログラミングで挫折しない学習方法を動画で公開中

エンコード、デコードとは

どちらもあるデータを異なる形式のデータに変換することを意味しますが、変換する方向が異なります。

エンコードは元のデータを別の形式のデータに変換する処理を指し、デコードは変換後のデータを元の形式のデータに戻す処理を指します。

base64エンコード・デコードの場合も変換する形式がbase64である点以外は同じです。

base64エンコードがデータをbase64形式のデータに変換し、base64デコードがbase64データを元の形式のデータに変換します。
 

PHPによる処理

phpでは、この処理にbase64_encode関数とbase64_decode関数を使います。

$greeting = 'Hello World!';

//文字列をbase64にエンコード
$encoded = base64_encode($greeting);

//base64形式データをデコードして元の文字列に戻す
$decoded = base64_decode($encoded);

print $decoded;

 

実行結果

Hello World!

 

finfo_bufferメソッドとは

finfo_buffer関数を使うとバイナリデータからMIMEタイプのような情報を取得できます。例えば、finfo_bufferを使えば画像データのMIMEタイプを取得して、特定のMIMEタイプかどうか判断したり、対応する拡張子を選ぶなどが可能になります。
インターネット上で送られてきたファイルやアップロードされたファイルには、拡張子のようなファイルの情報が付属するのが普通ですが、こうした情報は送信側で偽装することができます。ファイルのデータを安全に操作する為にも、実際のデータのMIMEタイプをfinfo_bufferで調べてそれを利用するのをお勧めします。
 

finfo_buffer関数

finfo_buffer ( resource $finfo , string $string )

この関数は、第1引数にfinfo_open() が返す fileinfo リソースを、第2引数に調べたいファイルデータを渡します。戻り値はファイルデータの情報を文字列で返します。エラーの場合は false を返します。
 

finfo_bufferのコード例

ファイルのデータからMIMEタイプを取得するコードは次のようになります。

 // ファイルデータを取得
 $path = 'sample.jpg';
 $data = file_get_contents($path);

 // まず、fileinfoリソースを作成(MIMEタイプなどのファイル情報を調べるためのデータベース)
 $finfo = finfo_open(FILEINFO_MIME_TYPE);

 //ファイルデータのMIMEタイプを取得
 $mime_type = finfo_buffer($finfo, $data);

 // MIMEタイプを出力
 print $mime_type;

 

実行結果

image/jpeg

 

 実際に書いてみよう

これまでの知識を使ってbase64形式の画像データを読み込んで、画像ファイルとして適切な拡張子を付けて保存するコードを実際に書いてみましょう。

まずサンプルとして、カモメのjpeg画像(searbird.jpg)を使います。

まず、この画像を変換してbase64形式のデータを用意します。

// ファイルのデータを取得
$file_path = 'seabird.jpg';
$data = file_get_contents($file_path);

// データをbase64にエンコード
$base64data = base64_encode($data);

以下のコードではbase64形式で変換した画像データ使いますが、base64形式のデータを外部から受信して処理することもあります。その場合は、HTTPリクエストで送信されたデータを取得するために、$_GETなどのグローバル変数を利用します。
 

base64データを画像ファイルとして保存するコード

<?php

// base64デコード
$data = base64_decode($base64data);

// finfo_bufferでMIMEタイプを取得
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime_type = finfo_buffer($finfo, $data);

//MIMEタイプをキーとした拡張子の配列
$extensions = [
    'image/gif' => 'gif',
    'image/jpeg' => 'jpg',
    'image/png' => 'png'
];

//MIMEタイプから拡張子を選択してファイル名を作成
$filename = 'image.' . $extensions[$mime_type];

// 画像ファイルの保存
file_put_contents($filename, $data);

 

実行結果

同じフォルダ内にimage.jpgファイルがあり、カモメの画像が保存されました。


 

解説

ここではまず、上で用意したbase64データをbase64_decode関数を使ってデコードして元の画像データに変換します。次にfinfo_buffer関数でMIMEタイプ(ここでは image/jpeg )を取得しています。最後に image/jpeg に対応する拡張子( jpg )を使って画像ファイルとして保存しています。
 

まとめ

この記事では、base64エンコード・デコードの方法、finfo_bufferを使ったMIMEタイプの取得の仕方とbase64データを画像ファイルとして保存する方法を解説しました。

MIMEタイプの取得は、base64に限らずアップロードファイルを処理する際などに役に立ちますので、覚えておくとよいでしょう。
 

筆者プロフィール

メンター安野

Webアプリケーションエンジニアとして長年健診業界で業務システムの開発に従事してきました。

TechAcademyではPHP/Laravelコースを担当しています。
開発実績: 健康診断システム、電話予約システム、検査管理システム、各種データ処理ツール

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

 

TechAcademyでは、初心者でもPHPやフレームワークのLaravelを使ってWebアプリケーション開発を習得できるオンラインブートキャンプPHP/Laravel講座を開催しています。

挫折しない学習方法を知れる説明動画や、現役エンジニアとのビデオ通話とチャットサポート、学習用カリキュラムを体験できる無料体験も実施しているので、ぜひ参加してみてください。