AWS s3下载特定文件夹中的所有文件 - 使用PHP SDK

时间:2014-01-24 09:59:05

标签: php amazon-s3

任何人都可以帮我这个.. ??

我想将所有文件从我的存储桶文件夹中的文件夹下载到我的计算机同名目录。

假设有一个桶名“ABC”里面有一个文件夹,是“DEF”..在哪个文件夹中有多个文件可用..

现在我想将它下载到我的项目文件夹“/ opt / lampp / htdocs / porject / files / download /”这里“DEF”文件夹也可用..

所以,任何人都可以帮助我,并为我提供代码..?

提前致谢..

=============

错误:

致命错误:未捕获异常'UnexpectedValueException',消息'RecursiveDirectoryIterator :: _ construct()[recursivedirectoryiterator .-- construct]:无法找到包装器“s3” - 您是否忘记在配置时启用它PHP?在/opt/lampp/htdocs/demo/amazon-s3/test.php:21堆栈跟踪:#0 /opt/lampp/htdocs/demo/amazon-s3/test.php(21):RecursiveDirectoryIterator-> _construct('s3:// bucketname / folder ...')在第21行的/opt/lampp/htdocs/demo/amazon-s3/test.php中抛出#1 {main}

2 个答案:

答案 0 :(得分:24)

Mark的答案完全有效,但使用AWS SDK for PHP using the downloadBucket() method还有一种更简单的方法。这是一个示例(假设$client是S3客户端的实例):

$bucket = 'YOUR_BUCKET_NAME';
$directory = 'YOUR_FOLDER_OR_KEY_PREFIX_IN_S3';
$basePath = 'YOUR_LOCAL_PATH/';

$client->downloadBucket($basePath . $directory, $bucket, $directory);

这个方法的一个很酷的事情是,它只排队本地目录中尚未存在(或尚未修改)的文件,并尝试并行下载它们,以加快整体速度下载时间。该方法有第四个参数(参见链接),其中包括其他选项,例如设置您希望一次发生多少并行下载。

答案 1 :(得分:3)

使用Amazon S3流包装器非常简单:

include dirname(__FILE__) . '/aws.phar';
$baseDirectory = dirname(__FILE__) .'/'.$myDirectoryName;


$client = \Aws\S3\S3Client::factory(array(
    'key'    => "<my key>",
    'secret' => "<my secret>"
));

$client->registerStreamWrapper();


$bucket = 's3://mys3bucket/' . $myDirectoryName

$iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($bucket),
    RecursiveIteratorIterator::SELF_FIRST
);

foreach($iterator as $name => $object) {
    if ($object->getFileName() !== '.' && $object->getFileName() !== '..') {
        $relative = substr($name,strlen($bucket)+1);
        if (!file_exists($baseDirectory . '/' . $path . '/' . $relative)) {
            if ($object->isDir()) {
                mkdir($baseDirectory . '/' . $path . '/' . $relative, 0777, true);
            } else {
                file_put_contents(
                    $baseDirectory . '/' . $path . '/' . $relative,
                    file_get_contents($name)
                );
            }
        }
    }
}