PHPでS3にあるファイルをSplFileObjectを使ってあれやこれやしようとすると Fatal Error

下記のようなエラーが発生しました。

① Fatal error: Uncaught RuntimeException: SplFileObject::__construct(): Unable to find the wrapper

② Fatal error: Uncaught RuntimeException: Cannot rewind file

なんぞこれ…って感じでしたが、対処法は公式ドキュメントに載ってましたね、有難い…。
AWSはドキュメントがしっかりしてて好きです。

公式ドキュメント

① の 対処法ですが、ドキュメントの上の方にあるように

Amazon S3 ストリームラッパーにより、組み込み PHP 関数 file_get_contents、fopen、copy、rename、unlink、mkdir、rmdir などを使用して Amazon S3 に対してデータの保存および取得ができます。使用するために Amazon S3 ストリームラッパーを登録する必要があります。


AWS SDK for PHPバージョン 3 の Amazon S3 ストリームラッパー

とあります。

なので、 $s3Client に対してこちらを追加します。

 $s3Client->registerStreamWrapper(); 

①は出なくなりました。
そしてファイル操作をしようとすると②のエラーが出ました。

こちらも同じページ書いてありました。有難い…。

「r」モードで開いたストリームは、ストリームからデータを読み取ることのみ可能です。さらに、デフォルトではシーク可能ではありません。これは、真にストリーミング方式でデータを Amazon S3 からダウンロードできるようにするためです。ここで、事前読み取りバイトをメモリにバッファする必要はありません。ストリームをシーク可能にする必要がある場合は、seekable を関数のストリームコンテキストオプションに渡すことができます。


シーク可能なストリームを開く

公式の通りにやってみましょう。
公式は fopen() 関数を例にしてサンプルを置いてくれていますが、SplFileObjectも同様です。

$context = stream_context_create(array(
        's3' => array(
            'seekable' => true
        )
    ));

$file = new SplFileObject($s3_path, 'r', false, $context);

他にもこの辺の関数も同様に使えるので file_exists() なんかを使って存在チェックなどもした方が良いかと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です