1

我是亚马逊 s3 的新手。在我的 cakephp3.0 应用程序中,我需要将文件从一个存储桶复制到另一个存储桶。为此,我使用 composer 安装了 AWS SDK,并在我的控制器构造函数中使用凭证初始化了 s3 客户端

public function initialize() {
    parent::initialize();
    $this->s3Client = new S3Client([
        'version' => 'latest',
        'region' => 'mumbai',
        'credentials' => [
            'key' => 'key',
            'secret' => 'secrect',
        ],
    ]);
}

在我的功能中复制文件

public function amazonCopy() {      
    $this->s3Client->registerStreamWrapper(); 
        $sourceBucket ="collect";
        $sourceKeyname = "testFolder";

       $s3Client->copyObject(array(
           'Bucket'     => "test1",
           'Key'        => testFolder,
           'CopySource' => "{$sourceBucket}/{$sourceKeyname}",
       )); 
    }
}

现在我收到一个错误

在“ https://s3.mumbai.amazonaws.com/ ”上执行“ListBuckets”时出错;AWS HTTP错误:创建资源时出错:[消息] fopen():php_network_getaddresses:getaddrinfo失败:名称或服务未知[文件] /var/www/mm/Src/php/operations/vendor/guzzlehttp/guzzle/src/Handler /StreamHandler.php [line] 312 [message] fopen( https://s3.mumbai.amazonaws.com/ ): 未能打开流: php_network_getaddresses: getaddrinfo 失败: 名称或服务未知 [文件] /var/www/ mm/Src/php/operations/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php [行] 312 Aws\S3\Exception\S3Exception

我想使用一个存储桶中的数据创建一个 zip 文件并将其复制到另一个存储桶,而不使用流将文件写入磁盘。这个错误的原因是什么?任何帮助将不胜感激。

现在,当我使用 zipstream 库时,作为流的压缩工作正常,因为我使用了代码

$this->s3Client->registerStreamWrapper();
$zip = new ZipStream\ZipStream('example.zip');

$zip->addFile('hello.txt', 'This is the contents of hello.txt');     

$zip->addFileFromPath('happy_children-wide.jpg', 's3://mmvideo-test/Music/happy_children-wide.jpg');
$zip->addFileFromPath('txte', 's3://test/Music/test1.txt');
$zip->finish();

但同样的问题是我想将 zip 输出即时写入 bucket2。因为我的文件将包含大尺寸的视频,所以无法将其存储在磁盘中作为临时存储。它应该以 zip 的形式即时写入存储桶。

4

1 回答 1

0

尝试过但无法使其仅与流一起使用。仅使用流下载并压缩到 tmp 文件中。

$client = new S3Client(array(
    'region'      => 'ap-northeast-1',
    'version'     => 'latest',
    'credentials' => $provider
));

$client->registerStreamWrapper();

$objects = $client->listObjectsV2([
    'Bucket' => $fromBucket,
    'Prefix' => $fromPrefix
]);
$keys = array();
foreach ($objects['Contents'] as $o) {
    $keys[] = $o['Key'];
}

$tmp = tempnam(sys_get_temp_dir(), 'zipstream');
echo "creating temp zip: $tmp\n";
$ostream = fopen($tmp, 'w');
$zip = new ZipStream(null, array(ZipStream::OPTION_OUTPUT_STREAM => $ostream));

foreach($keys as $k){
    echo "$k\n";
    $istream = fopen("s3://$fromBucket/$k", 'r');
    $zip->addFileFromStream($k, $istream);
    fflush($ostream);
    fclose($istream);
}

$zip->finish();

$client->putObject(array(
    'Bucket'       => $toBucket,
    'Key'          => $toZip,
    'SourceFile'   => $tmp
));
于 2017-01-17T05:56:50.610 回答