web-dev-qa-db-ja.com

PHPを使用してAmazonS3バケット内のすべてのファイルを一覧表示する簡単な方法は?

何万ものファイル名が含まれているAmazons3バケットがあります。バケット内のすべてのファイル名をリストするすべてのファイルまたはテキストファイルのリストを取得する最も簡単な方法は何ですか?

listObject()で試しましたが、1000個のファイルしかリストされていないようです。

Amazon-s3-returns-only-1000-entries-for-one-bucket-and-all-for-another-bucket-S3-Provider-does-not-get- 1000以上のアイテム-from-バケット

-> AWS SDK for PHPを使用したキーの一覧表示 しかし、awsのドキュメントでは

max-keys-文字列-オプション-メソッド呼び出しによって返される結果の最大数。返されるリストには、指定された値を超える結果は含まれませんが、返される結果は少なくなる場合があります。デフォルト値は1000です。

AWS DOC FOR list_objects

AWS PHP SDK?を使用して、すべてを一覧表示し、テキストファイルに出力する方法はありますか?

繰り返しの可能性:quick-way-to-list-all-files-in-Amazon-s3-bucket

Phpで解決策を探しているので、質問を再投稿しました。

コード:

$s3Client = S3Client::factory(array('key' => $access, 'secret' => $secret));

$response = $s3Client->listObjects(array('Bucket' => $bucket, 'MaxKeys' => 1000, 'Prefix' => 'files/'));
$files = $response->getPath('Contents');
$request_id = array();
foreach ($files as $file) {
    $filename = $file['Key'];
    print "\n\nFilename:". $filename;

 }
12
Hitesh

1000を超えるオブジェクトを取得するには、Markerパラメータを使用して複数のリクエストを行い、各リクエストの中断した場所をS3に通知する必要があります。 AWS SDK for PHPの Iterators 機能を使用すると、複数のAPIリクエストを行うロジックがカプセル化されるため、すべてのオブジェクトを簡単に取得できます。これを試してください。

$objects = $s3Client->getListObjectsIterator(array(
    'Bucket' => $bucket,
    'Prefix' => 'files/'
));

foreach ($objects as $object) {
    echo $object['Key'] . "\n";
}

最新のPHP SDK(2016年3月現在)では、代わりに次のようにコードを記述する必要があります。

$objects = $s3Client->getIterator('ListObjects', array(
    'Bucket' => $bucket,
    'Prefix' => 'files/'
));
13
Jeremy Lindblom

Paginatorを使用してすべてのファイルを取得します

    $client = new S3Client([
        'version' => AWS_S3_CLIENT_FACTORY_VERSION,
        'region' => AWS_S3_CLIENT_FACTORY_REGION,

    ]);
    $objects = $client->getPaginator('ListObjects', ['Bucket' => "my-bucket"]);
    foreach ($objects as $listResponse) {
        $items = $listResponse->search("Contents[?starts_with(Key,'path/to/folder/')]");
        foreach($items as $item) {
            echo $item['Key'] . PHP_EOL;
        }
    }

すべてのファイルを取得するには、検索を次のように変更します。

$listResponse->search("Contents[*]");
1
user563093

以下のコードは1つのトリックです。この問題を回避します。アルファベット順(az&AZ)のフォルダーがたくさんある私のCDN bucketフォルダーを指摘したので、複数のリクエストを行いました。すべてのファイルを一覧表示するには、

This code is to list mp4, pdf, png, jpg or all files

//letter range a-z and A-Z
$az = range('a', 'z');
$AZ = range('A', 'Z');
//To get the total no of files
$total = 0;
//text file
$File = "CDNFileList.txt"; 

//getting dropdownlist values 
$selectedoption = $_POST['cdn_dropdown_list'];
$file_ext = '';
if ($selectedoption == 'pdf'){
    $file_ext = 'PDF DOCUMENTS';
}else if(($selectedoption == 'jpg')){
    $file_ext = 'JPEG IMAGES';
}else if(($selectedoption == 'png')){
    $file_ext = 'PNG IMAGES';
}else if($selectedoption == 'mp4'){
    $file_ext = 'MP4 VIDEOS';
}else if($selectedoption == 'all'){
    $file_ext = 'ALL CONTENTS';
}
//Creating table
echo "<table style='width:300px' border='1'><th colspan='2'><b>List of $file_ext</b></th><tr><td><b>Name of the File</b></td><td><b>URL of the file</b></td></tr>";

foreach($az as $value){
        $response = $s3Client->listObjects(array('Bucket' => $bucket, 'MaxKeys' => 1000, 'Prefix' => 'files/'.$value));
        $files = $response->getPath('Contents');
        $file_list = array();
        foreach ($files as $file) {
                $filename = $file['Key'];
                if ( 'all' == ($selectedoption)){
                        $file_path_parts = pathinfo($filename);
                        $file_name = $file_path_parts['filename'];
                        echo "<tr><td>$file_name</td><td><a href = '";
                        echo $baseUrl.$filename;
                        echo "' target='_blank'>";
                        echo $baseUrl.$filename;
                        echo "</a></td></tr>";
                        $filename = $baseUrl.$filename.PHP_EOL; 
                        array_Push($file_list, $filename);
                        $total++;
                }else{
                    $filetype = strtolower(substr($filename, strrpos($filename, '.')+1));
                    if ($filetype == ($selectedoption)){
                        $file_path_parts = pathinfo($filename);
                        $file_name = $file_path_parts['filename'];
                        echo "<tr><td>$file_name</td><td><a href = '";
                        echo $baseUrl.$filename;
                        echo "' target='_blank'>";
                        echo $baseUrl.$filename;
                        echo "</a></td></tr>";
                        $filename = $baseUrl.$filename.PHP_EOL; 
                        array_Push($file_list, $filename);
                        $total++;
                    }
                }
        }
}

foreach($AZ as $value){
        $response = $s3Client->listObjects(array('Bucket' => $bucket, 'MaxKeys' => 1000, 'Prefix' => 'files/'.$value));
        $files = $response->getPath('Contents');
        $file_list = array();
        foreach ($files as $file) {
            $filename = $file['Key'];
            if ( 'all' == ($selectedoption)){
                    $file_path_parts = pathinfo($filename);
                    $file_name = $file_path_parts['filename'];
                    echo "<tr><td>$file_name</td><td><a href = '";
                    echo $baseUrl.$filename;
                    echo "' target='_blank'>";
                    echo $baseUrl.$filename;
                    echo "</a></td></tr>";
                    $filename = $baseUrl.$filename.PHP_EOL; 
                    array_Push($file_list, $filename);
                    $total++;
            }else{
                $filetype = strtolower(substr($filename, strrpos($filename, '.')+1));
                if ($filetype == ($selectedoption)){
                    $file_path_parts = pathinfo($filename);
                    $file_name = $file_path_parts['filename'];
                    echo "<tr><td>$file_name</td><td><a href = '";
                    echo $baseUrl.$filename;
                    echo "' target='_blank'>";
                    echo $baseUrl.$filename;
                    echo "</a></td></tr>";
                    $filename = $baseUrl.$filename.PHP_EOL; 
                    array_Push($file_list, $filename);
                    $total++;
                }
            }
        }
}
echo "</table><br/>";
print "\n\nTOTAL NO OF $file_ext ".$total;

すべてのファイル(1000を超える)を一覧表示するAWS APIがないため、これはこの問題の単なる回避策です。それが誰かを助けることを願っています。

1
Hitesh