PHP関数でAWS S3ファイルの書き込み・読み込み
AWS SDK for PHP Ver 3 では、 Amazon S3 ストリームラッパーというのを使うと fopen
や copy
、 file_get_contents
といった PHP の関数を使って、 S3 のファイルにアクセスすることができる。
ストリームラッパーを使って S3 にあるファイルへの読み込み、書き込みの方法をメモ。
ストリームラッパーを登録
S3Client
オブジェクトに、ストリームラッパーを登録すると s3://
というプロトコルを使って S3 オブジェクトにアクセス可能となる。
require 'PATH/vendor/autoload.php';
use Aws\S3\S3Client;
$s3Client = new S3Client([
'version' => 'latest',
'region' => 'REGION-NAME'
]);
// ストリームラッパー登録
$s3Client->registerStreamWrapper();
ファイルの読み込み (ダウンロード)
'key'
という表記は、「フォルダ名 + ファイル名」のこと。
fopen + fread
fopen()
とfread()
を使った方法。
$stream = fopen($file, 'r');
if (FALSE === $stream) {
exit("Failed to open.");
}
while (!feof($stream)) {
// 1,024 bytes づつ読み込み
echo fread($stream, 1024);
}
// ファイルを閉じる
fclose($stream);
file_get_contents
file_get_contents()
を使った方法。
この関数は、ファイルの中身を全部読みこむので、ファイルサイズが大きいときは使わない。
小さなファイルのときのみ。
$txt = file_get_contents('s3://bucket/key');
header('Content-Type: text/plain');
header('Content-Length: ' . count($txt));
header('Content-Disposition: attachment; filename=hoge.txt');
echo $txt;
ファイルの書き込み(アップロード)
file_put_contents
fopen()
( S3 とかどっかから) 取って来たデータを、 file_put_contents()
を使って S3 (またはどっか) にアップロードする。
// 読み込み
$file = fopen('s3://bucket001/key', 'r');
// 書き込み
file_put_contents('s3://bucket002/key', $file);
ファイルがなければ新規作成、ファイルが存在していれば上書きされる。
copy
どこかから取って来たデータをそのまま書き込む場合はコピーしちゃう。
ファイルがなければ新規作成、同名ファイルが存在していれば上書きされる。
bucket001 から bucket002 にコピー
copy('s3://bucket001/key', 's3://bucket002/key');
fopen + fwrite
fopen()
と fwrite()
を使った方法。サイズの大きなファイルをアップロードできる。
// 追記モードでファイルを開く
$stream = fopen('s3://bucket002/key', 'a');
// 「HogeHoge」を追記
fwrite($stream, 'HogeHoge');
fclose($stream);
ファイルを追記モードで開くなどは下記の項を参照。
fopen のモードについて
fopen のモード
fopen()
は第二引数に、 $mode パラメータを指定する。
Amazon S3 ストリームラッパーでサポートされている mode
パラメータ
モード | 説明 |
---|---|
r | 読み取り専用。 |
w | 書き込み専用。ファイルが存在している場合、上書き、存在しない場合、新規作成。 |
a | 書き込み専用。ファイルが存在している場合、追記、存在しない場合、新規作成。 |
x | 書き込み専用。ファイルが存在している場合 *1、エラー。 |
[注意] 公式ガイドの説明に間違いがある
本家のガイド AWS SDK for PHP – fopen モード には以下のように書いてあるが、ファイルが存在するとエラーになる。 PHP の仕様通りの動き。
PHP の仕様
モード 'x’ ファイルポインタをファイルの先頭に置きます。 ファイルが既に存在する場合には fopen() は失敗し、 E_WARNING レベルのエラーを発行します。 ファイルが存在しない場合には新規作成を試みます。
PHP マニュアル fopen
x
モードで fopen
したときのエラー
s3://bucket001/key already exists on Amazon S3