目次
はじめに
久しぶりの投稿だなー
サボりすぎかwww
今回はAWS SDK for PHPで用意されている関数doesObjectExist
を使って、
バケット内にあるフォルダーの存在チェックをやった時にハマった事を書いていきたいと思います。
問題
s3コンソール上で確認するとフォルダはあるにも関わらず、
doesObjectExist
で存在チェックするとfalse
で返ってくるケースがある!!!
原因
そもそもs3にはフォルダというものがなくて、所謂フォルダもファイルもオブジェクトとして認識している。
では、どんな場合に上記問題が発生するの?
存在しないフォルダに対して、直接ファイルをPUTする場合に発生してしまいます!
例:
プログラムなどでdata/
のフォルダがない状態で直接data/abc.txt
をPUTした場合
s3内部では以下のような形になります。
data/ #オブジェクトは存在しない!
data/abc.txt #オブジェクトは存在する
上記のような状況でdoesObjectExis
を使って、オブジェクトの存在チェックを行うとfalse
が返ってきます。
解決方法
では、どうすればいいの!!!
フォルダの存在チェックを行いたい場合はdoesObjectExis
を使わずに、listObjects
を使いましょう!
Sample
<?php
$config = array(
'region' => "リージョン情報",
'version' => 2006-03-01,
'credentials' => array(
'key' => "アクセスキー",
'secret' => "シークレットキー",
),
);
$s3 = new S3Client($config);
$list_objects = $s3->listObjects(array(
'Bucket' => "対象バケット",
'Prefix' => "確認したいフォルダパス",
'MaxKeys' => '1'
));
if (is_null($list_objects['Contents'])) {
return false;
}
listObjects
のPrefix
を使って、一致するオブジェクトを探す。
対象オブジェクトがあればContents
がセットされたレスポンスデータが返ってくるので、
一個でもあれば、フォルダがあるとみなして良いと思います。