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
以上で完了です。
ディスカッション
コメント一覧
まだ、コメントがありません