【问题标题】:Renaming a file with Amazon S3 PHP SDK使用 Amazon S3 PHP SDK 重命名文件
【发布时间】:2015-02-07 13:35:32
【问题描述】:

我正在努力使用 Amazon S3 SDK 重命名同一存储桶中的文件。我指的是 API 文档中的 copy object

这是我的电话,但它一直返回“指定的存储桶不存在”。

$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'
        ));

【问题讨论】:

  • 您能否发布错误消息的确切措辞?
  • 指定的bucket不存在
  • 您是否尝试过在客户端工厂中指定区域?
  • 嗨,安东尼,感谢您的帮助,但这并不是说我可以将文件复制到不同的存储桶,但不能重命名。
  • 环顾四周,这种问题可能是bucket的命名规则造成的。但是这个名字在你的例子中看起来很合适。

标签: php amazon-web-services amazon-s3 rename


【解决方案1】:

如果有人最终在这里寻找如何在 PHP 中做到这一点的最佳方法,您可以像这样重命名 s3 文件:

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

两个名称都需要包含完整的 s3 路径,例如:

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

基本上registerStreamWrapper() 为 s3 文件启用 PHP 文件系统命令。

【讨论】:

  • 使用rename时可以指定目标文件的ACL吗?它默认获取哪个ACL? (例如,原始文件的文件或总是“私人”或?)
  • 是否可以使用 s3 中的路径重命名本地服务器上的文件?喜欢rename('workspace/folder/test.txt', 's3://yourBucketName/folder/test1.txt')
【解决方案2】:

是的,要复制对象,您必须指定要复制的对象的存储桶名称。

以下来自官方文档的示例: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'
));

【讨论】:

  • 但是有一个问题,一旦文件名相同,在这种情况下targetKeynamesourceKeyname,它最终会删除文件。
猜你喜欢
  • 1970-01-01
  • 2020-06-05
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
相关资源
最近更新 更多