Я новичок в amazon s3.В моем приложении cakephp3.0 мне нужно скопировать файл из одного контейнера в другой. Для этого я установил AWS SDK с помощью composer и в своей функции конструктора контроллера я инициализировал клиента 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/«;
Ошибка HTTP AWS: Ошибка создания ресурса: [сообщение] fopen ():
php_network_getaddresses: getaddrinfo не удалось: имя или служба не
известный [файл] /var/www/mm/Src/php/operations/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php
[строка] 312 [сообщение] 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-файл, используя данные в одном сегменте, и скопировать его в другой сегмент без записи файла на диск с помощью потока. Что будет причиной этой ошибки? Любая помощь будет оценена.
Теперь поток zip as работает правильно, когда я использовал библиотеку 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 на лету в ведро2. Потому что мои файлы будут содержать видео большого размера, поэтому его невозможно сохранить на диске в качестве временного хранилища. это должно написать ведру как почтовый индекс на лету.
Пробовал, но не смог заставить его работать только с потоками. Использование потоков только для загрузки и архивирования в файл 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
));
Других решений пока нет …