php中的AWS sdk Amazon S3流包装器
我是AmazonS3的新手。在我的cakephp3.0应用程序中,我需要将文件从一个bucket复制到另一个bucket。为此,我使用composer安装了AWS SDK,并在控制器构造函数中使用凭据初始化了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', '
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