我正在努力使用 Amazon S3 开发工具包重命名同一存储桶中的文件。我指的是 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'
));
如果有人最终在这里寻找当今如何在 PHP 中执行此操作的最佳方法,您可以像这样重命名 s3 文件:
$s3sdk = new Sdk($awsConfig);
$s3 = $s3sdk->createS3();
$s3->registerStreamWrapper();
rename($oldName, $newName);
两个名称都需要包含完整的 S3 路径,例如:
"s3://yourBucketName/path/to/file"
基本上registerStreamWrapper()
为 s3 文件启用 PHP 文件系统命令。
是的
,要复制对象,您必须指定要复制的对象的存储桶名称。
下面是官方文档中的示例: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'
));