icon
icon

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

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

テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日  調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名  調査手法:インターネット調査

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

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

 

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

 

田島悠介

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

大石ゆかり

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

田島悠介

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

大石ゆかり

お願いします!

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

目次

1時間でできる無料体験!

 

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!

 

コラム

コスパとタイパ、両方結果的に良くなる良くなる学び方とは?

「スクールは高いし時間も縛られて効率が悪い」と考える方は多いと思います。
もちろん、時間も費用もかかることは間違いありません。
ただ 結果的に無駄な学びにお金も時間もかける方がリスクが高いという考えもあります。

コスパ・タイパ最適化の参考として、 テックアカデミー卒業生がスクールを選んだ理由 をご紹介します。

  • ・困ったときに、質問や相談できる相手がいるため挫折しなかった
  • ・プロとして必要なスキルのみを深く学べたので無駄がなかった
  • ・副業案件の提供と納品までのサポートがあったので目的を達成できた

安価・短期間で広く浅く学んでも意味がありません。 本当に自分の目的が達成できるか、それが重要です。
自分にどのスキルや学び方が合っているか、どんな学習方法かなど、お気軽に 無料相談 に参加してみませんか?

カウンセラー・現役のプロへ、何でも気軽に無料相談可能。 30分か60分お好きな時間が選べて、かつ3回まで すべて無料で ご利用できます。
無理な勧誘は一切ない ので、お気軽にご参加ください。

今なら相談した方限定の割引・参加特典付き! 無料相談はこちら

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 )を使って画像ファイルとして保存しています。
 

1時間でできる無料体験!

まとめ

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

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

筆者プロフィール

メンター安野

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

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

 

大石ゆかり

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

田島悠介

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

大石ゆかり

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

 

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

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

初心者・未経験でもできる。まずはテックアカデミーに相談しよう

プログラミングを独学で学習していて、このように感じた経験はないでしょうか?

  • ・調べてもほしい情報が見つからない
  • ・独学のスキルが実際の業務で通用するのか不安
  • ・目標への学習プランがわからず、迷子になりそう

テックアカデミーでは、このような 学習に不安を抱えている方へ、マンツーマンで相談できる機会を無料で提供 しています。
30分間、オンラインでどんなことでも質問し放題です。

「受けてよかった」と感じていただけるよう カウンセラーやエンジニア・デザイナー があなたの相談に真摯に向き合います。

「自分に合っているか診断してほしい」
「漠然としているが話を聞いてみたい」

こんなささいな悩みでも大丈夫です。

無理な勧誘は一切ありません ので、まずはお気軽にご参加ください。
※体験用のカリキュラムも無料で配布いたします。(1週間限定)

今なら参加者限定の割引特典付き! 無料相談を予約する