PHPでAWS S3へ画像をアップロードする方法

2022年10月22日プログラムAWS,PHP,プログラムサンプル

PHPでAWS S3へ画像をアップロードする方法
PHPでAWS S3へ画像をアップロードする方法

AWS S3へ画像ファイルをアップロードするPHPプログラムを紹介します。

ユート

PHPでAWS S3へ画像ファイルをアップロードするには、aws-sdk-phpをcomposerで準備しておく必要があります。(手順は後述しています)

PHPでAWS S3へ画像をアップロード

AWS S3へ画像ファイルをアップロードするPHPプログラムのサンプルコードを紹介します。(サンプルのプロジェクトディレクトリは /var/www/sample/ としています。)

サンプルコード

AWS S3へ画像ファイルをアップロードするPHPプログラムのサンプルコードです。

<?php
require_once('/var/www/sample/vendor/autoload.php');
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;

// S3関連
define('S3_KEY'    ,'<アクセスキー>');
define('S3_SECRET' ,'<シークレットアクセスキー>');
define('S3_BUCKET' ,'<バケット名>');

$source_file = @$_FILES['source_file'];
if ($source_file) {
	if ($source_file['size'] && $source_file['size'] > 0) {
		upload($source_file);
	}
}

/**
 * S3へアップロード
 */
function upload($source_file)
{
	try {
		// S3Clientインスタンス生成
		$s3Client = S3Client::factory([
			'credentials' => [
				'key'    => S3_KEY,
				'secret' => S3_SECRET,
			],
			'region'  => 'ap-northeast-1',
			'version' => 'latest',
		]);

		$option = [
			'ACL'        => 'public-read',
			'Bucket'     => S3_BUCKET,
			'Key'        => '<ファイルディレクトリ>/<ファイル名>',
			'SourceFile' => $source_file['tmp_name'],
		];

		$finfo = new finfo();
		$file_name = $source_file['tmp_name'];
		$mime_type = $finfo->file($file_name, FILEINFO_MIME_TYPE);
		if (strlen($mime_type ) > 0) {
			$option['ContentType']  = $mime_type ;
			$option['CacheControl'] = 'max-age=300';
		}

		$result = $s3Client->putObject($option);

		// 結果を表示
		echo('<pre>');
		print_r($result);
		echo('</pre>');
		exit;

	} catch (S3Exception $e) {
		print_r($e->getMessage());
	}
}
?>

<html>
	<head>
		<meta charset="UTF-8">
		<title>S3</title>
	</head>
	<body>
		<h1>S3アップロード</h1>
		<form method="post" action="/s3.php" enctype="multipart/form-data">
			<input type="file" name="source_file">
			<input type="submit">
		</form>
	</body>
</html>

HTML部分の解説

AWS S3へ画像ファイルをアップロードするPHPプログラムのサンプルコードのHTML部分を解説です。

文字コードをUTF-8で指定

HTMLの文字コードをUTF-8で指定します。これで文字化けが起こらないようにします。

<meta charset="UTF-8">

formタグを設置

<form method="post" action="/s3.php" enctype="multipart/form-data">
	<input type="file" name="source_file">
	<input type="submit">
</form>

PHP部分の解説

AWS S3へ画像ファイルをアップロードするPHPプログラムのサンプルコードのPHP部分を解説です。

オートローダーを読み込む

composerで作成したオートローダを読み込みます。そして名前空間のアリアスを定義します。

require_once('/var/www/sample/vendor/autoload.php');
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;

S3へアップロードする情報を定数で宣言

AWSのIAM作成時に生成された<アクセスキー>や<シークレットアクセスキー>を定数で宣言します。

define('S3_KEY'    ,'<アクセスキー>');
define('S3_SECRET' ,'<シークレットアクセスキー>');
define('S3_BUCKET' ,'<バケット名>');

アップロードファイルを取得

$source_file = @$_FILES['source_file'];

S3クライアントを作成

AWSリージョンやバージョンなどを指定してS3クライアントを作成します。

// S3Clientインスタンス生成
$s3Client = S3Client::factory([
	'credentials' => [
		'key'    => S3_KEY,
		'secret' => S3_SECRET,
	],
	'region'  => 'ap-northeast-1',
	'version' => 'latest',
]);

S3へアップロードする準備

S3へアップロードするために必要なオプション情報を配列へ格納します。

  • Bucket:バケット名
  • Key:S3へ保存するパス
  • SourceFile:アップロードするファイルのパス
$option = [
	'ACL'        => 'public-read',
	'Bucket'     => S3_BUCKET,
	'Key'        => '<ファイルディレクトリ>/<ファイル名>',
	'SourceFile' => $source_file['tmp_name'],
];

アップロードファイルのContent-Typeを取得

アップロードされたファイルのContent-Typeを取得します。
※ここではContent-Typeのチェックを行っていないですが、実際ではjpg、png、gifだけを許容するなどの確認を行います。

$finfo = new finfo();
$file_name = $source_file['tmp_name'];
$mime_type = $finfo->file($file_name, FILEINFO_MIME_TYPE);
if (strlen($mime_type ) > 0) {
	$option['ContentType']  = $mime_type ;
	$option['CacheControl'] = 'max-age=300';
}

S3バケットにファイルをアップロード

$s3Client->putObject()でS3バケットへファイルをアップロードします。

$result = $s3Client->putObject($option);
実行結果例
Aws\Result Object
(
    [data:Aws\Result:private] => Array
        (
            [Expiration] => 
            [ETag] => "**********"
            [ChecksumCRC32] => 
            [ChecksumCRC32C] => 
            [ChecksumSHA1] => 
            [ChecksumSHA256] => 
            [ServerSideEncryption] => 
            [VersionId] => 
            [SSECustomerAlgorithm] => 
            [SSECustomerKeyMD5] => 
            [SSEKMSKeyId] => 
            [SSEKMSEncryptionContext] => 
            [BucketKeyEnabled] => 
            [RequestCharged] => 
            [@metadata] => Array
                (
                    [statusCode] => 200
                    [effectiveUri] => https://s3.ap-northeast-1.amazonaws.com/<バケット名>/<ファイルディレクトリ>/<ファイル名>
                    [headers] => Array
                        (
                            [x-amz-id-2] => **********
                            [x-amz-request-id] => **********
                            [date] => Fri, 21 Oct 2022 08:10:36 GMT
                            [etag] => "**********"
                            [server] => AmazonS3
                            [content-length] => 0
                        )

                    [transferStats] => Array
                        (
                            [http] => Array
                                (
                                    [0] => Array
                                        (
                                        )

                                )

                        )

                )

            [ObjectURL] => https://s3.ap-northeast-1.amazonaws.com/<バケット名>/<ファイルディレクトリ>/<ファイル名>
        )

    [monitoringEvents:Aws\Result:private] => Array
        (
        )

)

AWS SDK for PHP のインストール

PHPでAWS S3へ画像ファイルをアップロードする際に使用するaws-sdk-phpをcomposerでインストールする手順を紹介します。

ユート

S3の需要も高まっているので、ぜひcomposerでaws-sdk-phpをインストールしてみてください。

もし使用環境にcomposerがインストールされていない方は、以下の記事を参考にしてみてください。
関連記事:Composerって何?!PHPのライブラリをインストールするのにPEARやPECLは古い?

インストール手順

ほんと簡単でcomposerで実行するだけです。
マニュアル:インストール:AWS SDK for PHPバージョン 3

プロジェクトディレクトリへ移動

このサンプルのプロジェクトディレクトリは /var/www/sample/ としています。

$ cd /var/www/sample/

composerでaws-sdk-phpをインストール

$ composer require aws/aws-sdk-php

以上で完了です。

プログラミングスクール受講メリット

・メンターにすぐ聞けるので分からないところでつまづかない
・受講生同士で学び合いモチベーション維持しやすい
・就学後に就職支援や進路サポートを受けることが出来る

ユート
ユート

1985年生まれ1児の父親です。Web系エンジニアを10年以上しています。
プロフィール
Amazon欲しいものリスト

2022年10月22日プログラムAWS,PHP,プログラムサンプル

Posted by ユート