问题 使用php列出Amazon S3存储桶中所有文件的快速方法?


我有一个亚马逊s3存储桶,里面有成千上万的文件名。获取列出存储桶中所有文件名的所有文件或文本文件列表的最简单方法是什么?

我试过了 listObject(),但它似乎只列出1000个文件。

亚马逊S3-回报只-1000条目换一斗,和所有为另一桶-U S3-提供商 - 不 - 不得到,更比1000项,从斗

- > 使用AWS SDK for PHP列出密钥 但在aws docs中,我读到了

max-keys - string - 可选 - 返回的最大结果数   通过方法调用。返回的列表将不再包含结果   比指定的值,但可能会返回更少。默认值为   1000。

AWS DOC FOR list_objects

有没有办法列出所有内容并使用AWS PHP SDK将其打印到文本文件?

可能的重复:  快速路到列表所有文件功能于亚马逊S3斗

我转发了这个问题,因为我正在寻找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;

 }

8470
2018-03-04 07:02


起源

请注意,在较新版本的PHP SDK中,必须像这样创建客户端: $s3Client = S3Client::factory(array('credentials' => array('key' => $access, 'secret' => $secret))); - TheStoryCoder
@TheStoryCoder:感谢您提供信息 - Hitesh


答案:


要获得超过1000个对象,您必须使用 Marker 参数告诉S3您为每个请求中断的位置。使用 迭代器 AWS SDK for PHP的功能使得获取所有对象变得更加容易,因为它封装了发出多个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/'
));

12
2018-03-06 01:27



你有点晚了,我也发现了相同的但是非常感谢,我确实做了一些努力让它对我有用但是因为我发现每个请求只列出1000并且如果你正在进行任何搜索(我们假设为只有pdf文件,它从这1000个结果中搜索)所以,我仍然不能确定计数,但我发现这是唯一的做法 - Hitesh
@jermy:你会推荐你的答案或我的答案?为什么? - Hitesh
我会说因为以下原因我的会更好:1。)它需要更少的请求。鉴于 n 是你的桶中S3对象的总数 files/ 前缀,我的解决方案需要ceil(n / 1000)请求。您的所有请求总是需要52个,无论是否全部需要。 2.)我只需要一个循环而不是两个带有嵌套循环的循环。 3.)如果您有超过1000个以特定字母开头的文件,则您的解决方案仅捕获每个字母的前1000个。我将永远得到你所有的对象。 - Jeremy Lindblom
我想要获得完整的URL,你可以这样做:sprintf('http://%。ss3.amazonaws.com/%s',$ bucket_name,$ object ['Key']) - supersan


下面的代码只是一个技巧,解决这个问题,我已经指出了我的 CDN bucket 按字母顺序排列有很多文件夹的文件夹(a-z和A-Z),所以我只做了多个请求,让它列出所有文件,

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;

这只是这个问题的一种解决方法,因为没有 AWS API 列出所有文件(超过1000个)。希望它可以帮助某人。


1
2018-03-06 06:00



我在列出S3对象时遇到错误.PHP致命错误:未捕获Aws \ S3 \ Exception \ PermanentRedirectException:AWS错误代码:PermanentRedirect,状态代码:301, - champs
AWS Request ID:E07DWDWED,AWS错误类型:客户端,AWS错误消息:您尝试访问的存储桶必须使用指定的端点进行寻址。请将以后的所有请求发送到此端点:“images.cser.in.s3.amazonaws.com”。,User-Agent:aws-sdk-php2 / 2.7.27 Guzzle / 3.9.3 curl / 7.40.0 PHP / 5.5 .31 ITR - champs
在第91行的/var/www/html/app/s3/vendor/aws/aws-sdk-php/src/Aws/Common/Exception/NamespaceExceptionFactory.php中引发 - champs
有人可以帮助理解这个错误...... - champs
请在SO中提出描述方案的问题。如果您已经提出问题,请分享链接 - Hitesh