S3 DeleteObject - DeleteMarker始终返回空

时间:2013-10-23 08:49:08

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

我正在使用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,
    ));

,回复是:

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

如果我这样做:

    // check if was deleted
    $is_deleted = (bool) $result->get('DeleteMarker');

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

更新:

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

键“path / to / my / image.jpg”导致DeleteMarker具有空值 键“/path/to/my/image.jpg”导致DeleteMarker为空假

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

2 个答案:

答案 0 :(得分:9)

从SDK v.1转换。?到2。?,我也遇到了不知道文件是否被删除的问题(曾经是->isOK()方法几乎可以让我知道文件是否被删除了。< / p>

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

基本上,不再有任何删除&#39;任何形式的旗帜。 Michael(Guzzle)建议的是:如果您想知道文件是否已删除,请使用->deleteObject()然后运行->doesObjectExist()以查看删除是否成功。

更改的基本原理是:新方法可以在不必等待回复的情况下触发大量删除请求。

它的价值。 大卫

答案 1 :(得分:2)

我遇到了与Javascript SDK相同的问题。无论文件是否存在,对deleteObject的调用都返回正常(HTTP 204)!这使得无法判断文件是否已从响应代码中删除。此外,如果存储桶启用了版本控制,则响应似乎仅包含DeleteMarker(另请参阅this thread on DeleteMarker)。

我看到两种可能解决这个问题。

作为第一个选项,您可以启用版本控制并使用DELETE Object versionID永久删除对象(see the AWS documentation)。这将要求您将versionID存储在数据库中,或者在使用listObjectVersions

删除之前对其进行查询

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

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