使用Amazon S3 PHP SDK重命名文件

 帝姬 发布于 2022-12-07 10:30

我很难用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'
        ));

小智.. 10

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

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

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

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

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

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

    2022-12-11 02:08 回答
  • 如果有人最终在这里寻找如何在PHP中如何做到这一点的最佳方法,你可以重命名s3文件,如下所示:

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

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

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

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

    2022-12-11 03:12 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有