【PHP8.x】base64_encode関数の使い方

作成日: 更新日:

base64_encode関数は、与えられたデータをBase64エンコード方式でエンコードする関数です。Base64エンコードは、バイナリデータをテキスト形式に変換する方式の一つで、主にメールの添付ファイルや、HTTPプロトコルでバイナリデータを送受信する際に利用されます。この関数は、任意の文字列を受け取り、その文字列をBase64でエンコードした文字列を返します。エンコードされた文字列は、アルファベットの大文字、小文字、数字、"+"、"/"、そしてパディング文字の"="のみで構成されます。

システムエンジニアを目指す初心者の方にとって、この関数は、例えば画像や音声ファイルなどのバイナリデータをWebアプリケーションで扱う際に役立ちます。データベースに直接バイナリデータを格納する代わりに、Base64エンコードされた文字列として保存し、必要に応じてデコードして利用するといった場面が考えられます。また、APIを通じてバイナリデータを送受信する際にも、Base64エンコードを用いることで、データの破損を防ぎ、安全なデータ伝送を実現できます。

注意点として、Base64エンコードされた文字列は、元のデータよりもサイズが大きくなる点があります。これは、6ビットのデータを8ビットの文字で表現するためです。そのため、エンコード・デコードの処理に伴うオーバーヘッドも考慮する必要があります。しかし、テキスト形式でデータを扱える利便性や、データ伝送の安全性を高められることから、Base64エンコードは広く利用されています。

基本的な使い方

構文(syntax)

base64_encode(string $data): string

引数(parameters)

string $string

  • string $string: エンコードしたい文字列

戻り値(return)

string

base64_encode関数は、指定された文字列をBase64エンコードした結果を文字列で返します。

サンプルコード

PHPでBase64エンコード・デコードする

<?php

// Base64エンコードしたい元の文字列を定義します。
// この文字列はデータとして扱われ、Base64形式に変換されます。
$originalString = "Hello, system engineers! This is a secret message.";

// base64_encode() 関数を使用して、文字列をBase64形式にエンコードします。
// Base64は、任意のバイナリデータをASCII文字列に変換するためのエンコーディング方式です。
$encodedString = base64_encode($originalString);

// エンコードされた文字列を出力します。
// この形式は、例えばURLやファイル名、HTMLのデータURLなど、
// 特定の環境でバイナリデータを安全に扱うために使用されます。
echo "Original String: " . $originalString . PHP_EOL;
echo "Encoded String (Base64): " . $encodedString . PHP_EOL;

// キーワードに「decode」が含まれるため、エンコードされた文字列を元の形にデコードする例も示します。
// base64_decode() 関数を使用して、Base64形式の文字列を元のデータにデコードします。
$decodedString = base64_decode($encodedString);

// デコードされた文字列を出力し、元の文字列と比較します。
// デコードが成功すれば、元の文字列と一致するはずです。
echo "Decoded String (from Base64): " . $decodedString . PHP_EOL;

// 元の文字列とデコードされた文字列が一致するか確認します。
if ($originalString === $decodedString) {
    echo "Verification: Original and decoded strings match. Encoding and decoding were successful." . PHP_EOL;
} else {
    echo "Verification: Mismatch between original and decoded strings. Something went wrong." . PHP_EOL;
}

PHPのbase64_encode関数は、与えられた文字列データ(引数$string)を、Base64形式と呼ばれる別の文字列(戻り値string)に変換するために使用されます。Base64は、バイナリデータを含む任意の情報を、テキスト形式で安全に扱うためのエンコーディング方式です。例えば、URLにバイナリデータを埋め込んだり、メールで添付ファイルを送ったりする際に、データが破損しないようにこの形式が使われます。

サンプルコードでは、まず$originalStringという変数に、エンコードしたい元の文字列を定義しています。次に、base64_encode()関数を呼び出し、この$originalStringを引数として渡します。関数は、指定された文字列をBase64形式に変換した結果を戻り値として返し、それが$encodedString変数に格納されます。これにより、元のデータがテキストとして扱える安全な形式に変換されます。

さらに、キーワードに「decode」が含まれるため、エンコードされた文字列を元のデータに戻すbase64_decode()関数の使用例も示しています。base64_decode()関数に$encodedStringを引数として渡すと、Base64形式のデータが元の文字列に復元され、$decodedStringに格納されます。最後に、元の文字列とデコードされた文字列が一致するかを確認し、エンコードとデコードの処理が正しく行われたことを検証しています。このように、Base64エンコード・デコードは、データの安全な取り扱いにおいて重要な役割を果たす基本的な技術です。

Base64エンコードは、データを安全に伝送できる形式に変換するものであり、内容を隠す暗号化とは目的が異なります。エンコード後のデータサイズは元の文字列より約33%増加することに留意してください。base64_encodeの出力はURLに直接利用できない文字を含む場合があるため、URLパラメータとして使用する際は、別途URLセーフなエンコード処理を適用することをおすすめします。base64_decodeは、不正なBase64文字列を与えられた場合にfalseを返す可能性がありますので、デコード結果が期待通りか必ず確認し、安全なコードを記述してください。

PHPでURL画像からBase64エンコードデータURIを生成する

<?php

/**
 * 指定されたURLから画像を取得し、Base64エンコードされたデータURI文字列を生成します。
 *
 * Base64エンコードされた画像は、HTMLのimgタグのsrc属性やCSSのbackground-imageプロパティなどで
 * 直接利用できる形式 (例: data:image/png;base64,iVBORw0...) に変換されます。
 *
 * @param string $imageUrl エンコードする画像のURL。
 * @return string|false Base64エンコードされた画像のデータURI文字列、
 *                      または画像の取得やエンコードに失敗した場合はfalse。
 */
function getImageBase64DataUri(string $imageUrl): string|false
{
    // 1. 指定されたURLから画像データをバイナリ形式で取得します。
    // file_get_contents() は、ファイルの全内容を文字列として読み込む関数です。
    // 画像のようなバイナリデータも適切に扱えます。
    // エラーが発生した場合(例: URLが見つからない、ネットワークエラーなど)はfalseを返します。
    $imageData = @file_get_contents($imageUrl); // @はエラー出力を抑制します。

    // 2. 画像データの取得に失敗したか確認します。
    if ($imageData === false) {
        // 失敗した場合はfalseを返して処理を終了します。
        // 実際のアプリケーションでは、エラーログの記録などを行います。
        return false;
    }

    // 3. 取得したバイナリデータをBase64形式にエンコードします。
    // base64_encode() は、バイナリデータをテキスト形式に変換します。
    // これにより、バイナリデータをテキストとして安全に転送できるようになります。
    $base64EncodedData = base64_encode($imageData);

    // 4. 画像のMIMEタイプ(形式)を特定します。
    // データURIとして利用するためには、画像のMIMEタイプ(例: image/jpeg, image/png)が必要です。
    // URLのファイル拡張子から推測しますが、これは簡易的な方法です。
    // より正確な方法としては finfo_open() などがありますが、初心者向けに簡潔さを優先します。
    $extension = pathinfo($imageUrl, PATHINFO_EXTENSION);
    $mimeType = match (strtolower($extension)) {
        'jpg', 'jpeg' => 'image/jpeg',
        'png'        => 'image/png',
        'gif'        => 'image/gif',
        'svg'        => 'image/svg+xml',
        default      => 'application/octet-stream', // 不明な場合は汎用MIMEタイプ
    };

    // 5. Base64エンコードされたデータとMIMEタイプを組み合わせてデータURI文字列を生成します。
    // データURIの形式は "data:[<MIMEタイプ>][;charset=<文字セット>][;base64],<データ>" です。
    return "data:{$mimeType};base64,{$base64EncodedData}";
}

// --- 以下は、上記関数の使用例です ---

// エンコードしたい画像のURLを指定します。
// これは一般的なプレースホルダー画像サービスからのURLです。
$targetImageUrl = 'https://via.placeholder.com/150/FF0000/FFFFFF?text=PHP';

// 関数を呼び出してBase64データURIを取得します。
$base64ImageUri = getImageBase64DataUri($targetImageUrl);

// 結果を確認し、成功した場合は出力します。
if ($base64ImageUri !== false) {
    echo "画像URL: " . $targetImageUrl . "\n";
    echo "Base64エンコードされたデータURI:\n";
    echo $base64ImageUri . "\n\n";

    echo "--- HTMLでの使用例 (このPHPコードをWebサーバーで実行した場合) ---\n";
    // Webブラウザで画像を表示するためのHTML imgタグの例
    echo '<img src="' . htmlspecialchars($base64ImageUri) . '" alt="Base64エンコード画像" style="border: 1px solid #ccc; padding: 5px;">';
    echo "\n<p>このテキストの上に画像が表示されます。</p>";
} else {
    echo "エラー: 指定されたURL '{$targetImageUrl}' から画像を読み込むことができませんでした。\n";
    echo "URLが正しいか、インターネット接続が利用可能か確認してください。\n";
}

PHPのbase64_encode関数は、画像のようなバイナリデータを、テキストとして安全に扱えるBase64形式に変換するために使用されます。この関数は、引数として変換したいバイナリデータを含む文字列($string)を受け取り、Base64エンコードされた新しい文字列を返します。

サンプルコードでは、このbase64_encode関数を使い、インターネット上の画像URLから取得した画像をBase64形式のデータURIに変換する一連の処理を示しています。具体的には、まずfile_get_contents関数で指定されたURLから画像のバイナリデータを取得します。この取得したバイナリデータをbase64_encode関数に渡すことで、テキストとして安全に扱えるBase64文字列に変換します。

その後、画像のMIMEタイプ(例: image/png)とBase64エンコードされたデータを組み合わせ、「data:image/png;base64,...」のような「データURI」文字列を生成しています。このデータURIは、HTMLの<img>タグのsrc属性に直接記述することで、外部の画像ファイルを参照することなくWebページに画像を埋め込むことができます。これにより、HTTPリクエストを減らし、ページの表示速度向上に貢献するなど、様々なWeb開発の場面で利用されます。

file_get_contents関数による外部URLからのデータ取得は、ネットワーク状況やURLの有効性によって失敗することがあります。サンプルコードの@演算子はエラー出力を抑制しますが、デバッグを困難にするため、本番環境ではエラーログの記録など、より詳細なエラーハンドリングを導入してください。画像のMIMEタイプ判定は拡張子からの推測であり簡易的なものです。より正確な判定が必要な場合は、finfo_open関数などの利用を検討することをおすすめします。Base64エンコードされたデータは元のバイナリデータよりも約33%サイズが大きくなるため、大きな画像を扱う場合はページの表示速度やメモリ使用量に影響を与える可能性があります。また、外部URLからのデータ取得は、不正なコンテンツや大量のリソース消費といったセキュリティリスクを伴うため、URLの厳格な検証や取得データの制限を考慮することが重要です。HTML出力の際には、サンプルコードのようにhtmlspecialchars関数でエスケープ処理を行い、クロスサイトスクリプティング(XSS)などの脆弱性を防ぐ習慣をつけましょう。

【PHP8.x】base64_encode関数の使い方 | いっしー@Webエンジニア