Переименование файла с помощью Amazon S3 PHP SDK

Я изо всех сил пытаюсь переименовать файл в том же сегменте с помощью Amazon S3 SDK. Я имею в виду копировать объект в документах API.

Вот мой звонок, но он продолжает возвращать «указанное ведро не существует».

$clients = S3Client::factory(array(
'key'    => 'key',
'secret' => 'secret'
));

try {

$result = $clients->copyObject(array(
'ACL' => 'private',
// Bucket is required
'Bucket' => 'david1982.audio',
// CopySource is required
'CopySource' =>  'mp3/music.mp3',
// Key is required
'Key' => 'mp3/music_name_updated.mp3',
'MetadataDirective' => 'REPLACE'
));

echo json_encode($result);

} catch (Exception $e) {
echo json_encode($e->getMessage());
}

Прежде чем кто-то укажет на очевидное и спросит: «Ваше ведро существует?» Да, оно определенно существует. Я могу выполнить вызов с теми же ключами и получить все мои файлы из этого ведра.

Я действительно хочу иметь возможность переименовать файл через API. Вы можете сделать это в браузере Amazon S3.


Решение найдено

По какой-то причине вы должны включить ведро в CopySource,

$result = $clients->copyObject(array(
'ACL' => 'private',
// Bucket is required
'Bucket' => 'david1982.audio',
// CopySource is required
'CopySource' =>  'david1982.audio/mp3/music.mp3',
// Key is required
'Key' => 'mp3/music_name_updated.mp3',
'MetadataDirective' => 'REPLACE'
));

8

Решение

Если кто-то в конце концов попытается найти лучший способ сделать это в настоящее время в PHP, вы можете переименовать файлы s3 следующим образом:

$s3sdk = new Sdk($awsConfig);
$s3 = $s3sdk->createS3();
$s3->registerStreamWrapper();
rename($oldName, $newName);

оба имени должны содержать полный путь s3, например:

"s3://yourBucketName/path/to/file"

В принципе registerStreamWrapper() включает команды файловой системы PHP для файлов s3.

8

Другие решения

Да, чтобы скопировать объект, вы должны указать имя сегмента копируемого объекта.

Ниже приведен пример из официальной документации: http://docs.aws.amazon.com/AmazonS3/latest/dev/CopyingObjectUsingPHP.html)

use Aws\S3\S3Client;

$sourceBucket = '*** Your Source Bucket Name ***';
$sourceKeyname = '*** Your Source Object Key ***';
$targetBucket = '*** Your Target Bucket Name ***';
$targetKeyname = '*** Your Target Key Name ***';

// Instantiate the client.
$s3 = S3Client::factory();

// Copy an object.
$s3->copyObject(array(
'Bucket'     => $targetBucket,
'Key'        => $targetKeyname,
'CopySource' => "{$sourceBucket}/{$sourceKeyname}",
));

После того, как вы скопировали объект, вам придется удалить старый, вот пример:

$result = $client->deleteObject(array(
'Bucket' => 'string',
'Key' => 'string'
));
6

По вопросам рекламы [email protected]