AWS S3のStreamWrapperでfile_put_contentsを使う時にACLを設定する方法

こんにちは!ぐちです。

ACL(アクセスコントロールリスト)を設定する

CakePHPからAWS S3に画像を保存する方法でS3を用いた画像のアップロードについて書きましたがその際にACLを設定する方法をご紹介します。

デフォルトでは非公開になる?!

先日投稿しました記事の中でS3.phpに様々なメソッドを定義したと書きましたがファイルをアップロードするために以下のメソッドを追加しました。

protected function uploadFile($path, $fileName) {
    $ret = file_put_contents(S3_TARGET_URL.$path, file_get_contents($fileName));
    return ($ret == false ? false : true);
}

この処理でS3へファイルをアップロードするとACLがデフォルトのPrivateが設定されてしまいます。上記の処理は画像ファイルを公開(URLで誰でも見られるように)したかったので下記のようにACLを指定して公開(読み取り)にするように変更しました。

protected function uploadFile($path, $fileName) {
    $context = stream_context_create(array(
        's3' => array(
            'ACL' => CannedAcl::PUBLIC_READ
        )
    ));
    $ret = file_put_contents(S3_TARGET_URL.$path, file_get_contents($fileName), null, $context);
    return ($ret == false ? false : true);
}

ちなみにcopy()を使って階層が変わるような複製をした場合にもACLがPrivateに戻るようなので下記のように設定を渡すようにしました。

copy(S3_TARGET_URL.$srcPath.$fileName, S3_TARGET_URL.$dstPath.$fileName, $context);

今回も例によって間違いや「おいおい。。。」という内容があるかもしれませんがご容赦ください。。。