7

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

我的删除电话是:

    // 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 总是假的。即使删除操作实际上成功并且文件已从 S3 中删除,怎么可能没有针对 DeleteMarker 键返回值?

更新:

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

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

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

4

2 回答 2

10

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

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

基本上,不再有任何类型的“已删除”标志。Michael (Guzzle) 的建议是:如果你想知道一个文件是否被删除,使用->deleteObject()然后运行->doesObjectExist()看看是否删除成功。

更改的基本原理是:新方法可以让您触发大量删除请求,而无需等待回复等。

物有所值。大卫

于 2014-07-28T20:31:01.287 回答
3

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

我看到解决此问题的两种可能性。

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

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

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

于 2013-12-17T16:40:38.687 回答