S3 DeleteObject - DeleteMarker始终返回空

Adr*_*lls 7 php amazon-s3 amazon-web-services

我正在使用AWS SDK for PHP,版本2.4.7通过composer安装.从S3存储桶删除文件后,即使文件实际已从S3中删除,响应对象中的DeleteMarker键也始终为空.文档说明如果操作成功则DeleteMarker应为true,否则为false.

我的删除电话是:

    // delete S3 object
    $result = $s3->deleteObject(array(
        'Bucket' => $this->_bucket,
        'Key' => $object_key,
    ));
Run Code Online (Sandbox Code Playgroud)

并且响应是:

Guzzle\Service\Resource\Model Object
(
    [structure:protected] =>
    [data:protected] => Array
        (
            [DeleteMarker] =>
            [VersionId] =>
            [RequestId] => 2CC3EC60C4294CB5
        )
)
Run Code Online (Sandbox Code Playgroud)

如果我那么做:

    // check if was deleted
    $is_deleted = (bool) $result->get('DeleteMarker');
Run Code Online (Sandbox Code Playgroud)

$ is_deleted始终为false.如果删除操作实际上成功并且文件已从S3中删除,那么对于DeleteMarker键是否没有返回值?

更新:

如果我在我的键的开头添加一个斜杠,我会得到一个错误的回复,即使该文件仍然从S3中删除.

键"path/to/my/image.jpg"导致DeleteMarker具有空值Key"/path/to/my/image.jpg"导致DeleteMarker为空false

但在这两种情况下,图像都从S3存储桶中删除.

小智 9

从SDK v.1转换.?到2.?,我也遇到了不知道文件是否被删除的问题(过去->isOK()几乎所有的方法都会让我知道文件是否被删除).

我终于偶然发现了Guzzle创建者的回复:https://forums.aws.amazon.com/thread.jspa messageID = 455154

基本上,不再有任何"删除"标志.Michael(Guzzle)建议的是:如果您想知道文件是否已删除,请使用->deleteObject()然后运行->doesObjectExist()以查看删除是否成功.

改变的基本原理是:新方法允许您触发大量删除请求,而无需等待回复等.

物有所值.大卫


Sim*_*zle 3

我在使用 Javascript SDK 时遇到了同样的问题。deleteObject无论文件是否存在,调用都会返回罚款(HTTP 204)!这使得无法从响应代码中判断文件是否已被删除。此外,响应似乎仅包括DeleteMarker存储桶启用了版本控制的情况(另请参阅上的此线程DeleteMarker)。

我认为解决这个问题有两种可能性。

作为第一个选项,您可以启用版本控制并用于DELETE Object versionID永久删除您的对象(请参阅 AWS 文档)。这将要求您将其存储versionID在数据库中,或者在删除之前使用查询它listObjectVersions

作为第二个选项,您可以使用listObjects检查文件是否存在,使用删除文件deleteObjectlistObjects再次检查以确保文件已被删除。

我对这两种解决方案都不满意,但他们现在可以完成工作