【问题标题】:PHP Amazon S3 Uploads And TagsPHP Amazon S3 上传和标签
【发布时间】:2026-01-01 19:35:01
【问题描述】:

我正在编写一个视频共享网站。我正在使用 S3 来存储和提供视频。我已经为我的 MySQL 数据库中的视频编写了标签,但我看到 S3 支持上传文件的设置标签。这是我用来上传文件的代码:

try {
                //Create a S3Client
                $s3Client = new S3Client([
                    'region' => 'us-east-1',
                    'version' => 'latest',
                    'credentials' => [
                        'key' => '',
                        'secret' => ''
                    ]
                ]);
                $result = $s3Client->putObject([
                    'Bucket' => $bucket,
                    'Key' => $assetFilename,
                    'SourceFile' => $fileTmpPath,
                    'Metadata'   => array(
                        'title' => $requestAr['title'],
                        'description' => $requestAr['description']
                    )
                ]);
                $s3Client->waitUntil('ObjectExists', array(
                    'Bucket' => $bucket,
                    'Key'    => $assetFilename
                ));
            } catch (S3Exception $e) {
                returnError($e->getMessage());
            }

这是一个两部分的问题。首先,如何在此处指定标签?我找不到任何 PHP 示例。接下来,假设有人上传了一个视频并在其上添加了标签。 S3 标签是键/值对。我应该为键设置什么?我正在考虑为每个视频使用类似 [tag1, tag2, tag3] 之类的东西,并将它们的值作为标签字符串。这是 S3 标签文档:https://docs.aws.amazon.com/AmazonS3/latest/dev/object-tagging.html

【问题讨论】:

    标签: php amazon-s3 tags


    【解决方案1】:

    要设置对象标记,只需将Tagging 元素传递给putObject() 参数即可。在你的情况下,它会是这样的:

    $result = $s3Client->putObject([
        'Bucket' => $bucket,
        'Key' => $assetFilename,
        'SourceFile' => $fileTmpPath,
        'Tagging' => 'category=tag1', // your tag here!
        'Metadata'   => array(
            'title' => $requestAr['title'],
            'description' => $requestAr['description']
        )
    ]);
    

    注意标签是一个简单的key=value 字符串。作为“超前思考”措施,我将标签设为category=tagValue,这样您就可以对它们进行分类并最终添加更多标签类别。如果你这样做tag1=true,那么它会很快变得混乱。

    【讨论】:

    • 谢谢。至于类别,我什至没有计划有标签类别。像 YouTube 这样的网站甚至使用它们吗?我认为他们只是让您输入标签列表而不对它们进行分类。我不知道如何对它们进行分类,除非我在标记时要求用户这样做(不是他们可能想要处理的事情)。
    • 我的意思是,也许现在你想要标签,moviemusic video 等。但稍后你可能想要 >1 min>1 hour 或其他标签,如果你有他们喜欢movie=true,或>1min=true,而不是cateogory=movielength=>1min,那么你将在同一个“命名空间”中拥有所有标签,这将是一团糟。
    • 好的。既然我看到那里存在标记信息,不应该更像这样吗? docs.aws.amazon.com/aws-sdk-php/v3/api/…
    • 这可能更简洁一些,但您需要考虑页面的响应能力。这样做,您需要对端点进行 2 次往返,而不是 1 次,这可能会更慢。而且它们需要串联,而不是并联,因为您需要等待对象完成上传以标记它。但是,要获取标签,您肯定需要拨打getObjectTagging(),这是没有办法的。
    • 只是一个查询字符串。你可以这样做:red=true&blue=false