【问题标题】:AWS s3 download all file inside a specific folder - Using PHP SDKAWS s3 下载特定文件夹中的所有文件 - 使用 PHP SDK
【发布时间】:2014-01-24 09:59:04
【问题描述】:

谁能帮我做这个..??

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

假设有一个存储桶名称“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...') #1 {main} 在第 21 行的 /opt/lampp/htdocs/demo/amazon-s3/test.php 中抛出

【问题讨论】:

    标签: php amazon-s3


    【解决方案1】:

    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);
    

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

    【讨论】:

    • 你的回答很简单,很容易实现
    • 这只是一个问题:对于大目录,脚本中断(即使没有 max_execution_time)没有任何警告。有什么办法可以避免吗?
    【解决方案2】:

    使用 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)
                    );
                }
            }
        }
    }
    

    【讨论】:

    • $bucket = 's3://mys3bucket/' 。 $我的目录名称。抛出错误..那不起作用..编辑错误答案..
    • 它抛出了什么错误?错误消息旨在帮助识别问题,而不仅仅是导致开发人员恶化;所以了解它们是什么是很有用的
    • 如果我认为是这样,你真的应该能够诊断出我在输入这个答案时错过了;
    • 你下载亚马逊的aws sdk library了吗?我犯了一个严重的错误,我认为有些事情是理所当然的:我认为任何使用 AWS 和 PHP 的人都已经在使用这个
    • 是的,我已经从这个链接下载了 aws sdk 库。pear.amazonwebservices.com/get/aws.zip ..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 2019-11-26
    相关资源
    最近更新 更多