php中的AWS sdk Amazon S3流包装器



我是amazons3的新手。在我的cakeph3.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}",
)); 
}
}

现在我得到一个错误

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

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

现在,当我使用zipstream库时,zipping as stream正常工作,我使用了代码

$this->s3Client->registerStreamWrapper();
$zip = new ZipStreamZipStream('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。

已尝试,但无法使其仅用于流。仅使用流下载并压缩到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: $tmpn";
$ostream = fopen($tmp, 'w');
$zip = new ZipStream(null, array(ZipStream::OPTION_OUTPUT_STREAM => $ostream));
foreach($keys as $k){
echo "$kn";
$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
));

最新更新