php中的AWS sdk Amazon S3流包装器

php中的AWS sdk Amazon S3流包装器,php,amazon-s3,zip,cakephp-3.0,php-stream-wrappers,Php,Amazon S3,Zip,Cakephp 3.0,Php Stream Wrappers,我是AmazonS3的新手。在我的cakephp3.0应用程序中,我需要将文件从一个bucket复制到另一个bucket。为此,我使用composer安装了AWS SDK,并在控制器构造函数中使用凭据初始化了s3客户端 public function initialize() { parent::initialize(); $this->s3Client = new S3Client([ 'version' => 'latest', '

我是AmazonS3的新手。在我的cakephp3.0应用程序中,我需要将文件从一个bucket复制到另一个bucket。为此,我使用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}",
       )); 
    }
}
现在我得到一个错误

在“”上执行“ListBucket”时出错; AWS HTTP错误:创建资源时出错:[message]fopen(): php_网络_getaddresses:getaddrinfo失败:名称或服务不可用 已知[文件] /var/www/mm/Src/php/operations/vendor/guzzlehttp/guzzle/Src/Handler/StreamHandler.php [行]312[消息]fopen():失败 打开流:php\u network\u getaddresses:getaddrinfo失败:Name或 服务未知[文件] /var/www/mm/Src/php/operations/vendor/guzzlehttp/guzzle/Src/Handler/StreamHandler.php [line]312 Aws\S3\Exception\S3Exception


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

现在,当我使用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的形式写入bucket。

尝试过,但无法使其仅用于流。仅使用streams下载并压缩到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
));

尝试过,但无法使其仅用于流。仅使用streams下载并压缩到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
));

我想使用一个bucket中的数据创建一个zip文件,并将其复制到另一个bucket,而不使用stream将文件写入磁盘。是否将多个文件写入一个zip存档?还是压缩每个文件?看着你的眼睛,你似乎不能用溪流来做这件事。但是你可以使用zlib hi at0mzk使用streams压缩单个文件。我想将多个文件压缩到一个zip存档中。使用zip stream是可行的,但我想将其写入我指定的s3bucket。它应该在飞行中发生。现在可以将zip设置为流,但不可以写入s3bucketI我认为无论如何都必须为zip使用临时文件,请参见注释:因为Amazon S3要求在发送请求的有效负载之前指定内容长度头,PutObject操作中要上载的数据使用PHP临时流进行内部缓冲,直到流被刷新或关闭。尝试并获取CouldNotCreateCheckSumException我想使用一个bucket中的数据创建一个zip文件,并将其复制到另一个bucket,而无需使用stream将文件写入磁盘。将多个文件写入一个zip档案文件还是压缩每个文件?看着你的眼睛,你似乎不能用溪流来做这件事。但是你可以使用zlib hi at0mzk使用streams压缩单个文件。我想将多个文件压缩到一个zip存档中。使用zip stream是可行的,但我想将其写入我指定的s3bucket。它应该在飞行中发生。现在可以将zip设置为流,但不可以写入s3bucketI我认为无论如何都必须为zip使用临时文件,请参见注释:因为Amazon S3要求在发送请求的有效负载之前指定内容长度头,要在PutObject操作中上载的数据使用PHP临时流进行内部缓冲,直到流被刷新或关闭。请尝试并获取CouldNotCreateChecksumException