2013-10-23 19 views
6

PHP用のAWS SDK、バージョン2.4.7をコンポーザを使用してインストールしています。 S3バケットからファイルを削除した後、S3から実際にファイルが削除されても、応答オブジェクトのDeleteMarkerキーは常に空になります。ドキュメントには、操作が成功した場合はDeleteMarkerがtrueである必要があり、それ以外の場合はfalseであることが示されています。S3 DeleteObject - 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は常にfalseです。削除操作が実際に成功し、ファイルがS3から削除されたにもかかわらず、DeleteMarkerキーに対して値が返されないのはどうしてですか?

UPDATE:

私は私のキーの先頭にスラッシュを追加した場合、私は、ファイルがまだS3から削除されていても戻って偽の応答を取得します。 DeleteMarkerで キー「/path/to/my/image.jpg」の結果が空の偽

を持つ。しかし、両方のケースでは空の値を持つDeleteMarkerで

キー「パス/に/私/ image.jpg」の結果イメージはS3バケットから削除されます。

+0

この同じ問題があります。あなたはこれを解決しましたか? – Scott

+0

いいえ、決して解決されませんでした。バケツのバージョニングを有効にしたくないので、Simonが以下に示唆しているようにして、削除呼び出し後にファイルが存在するかどうかを確認するために2番目の呼び出しを発行します。それが成功したかどうかを私が知っていれば、これを削除して知ることができれば、それは良いことではないでしょう。 –

答えて

2

Javascript SDKで同じ問題が発生しています。ファイルが存在するかどうかにかかわらず、deleteObjectへの呼び出しは正常に戻ります(HTTP 204)。これにより、ファイルが応答コードから削除されたかどうかを知ることができなくなります。さらに、バケットのバージョニングが有効になっている場合(this thread on DeleteMarkerも参照)、応答にはDeleteMarkerしか含まれていないようです。

この問題を回避するには、2つの可能性があります。

最初のオプションとして、バージョン管理を有効にしてDELETE Object versionIDを使用してオブジェクトを完全に削除することができます(see the AWS documentation)。これは、データベース内のversionIDを保存するか、あなたを必要とし、またはファイルが存在する場合、それは前に第二の選択肢としてlistObjectVersions

を使用して削除することが、あなたがチェックするlistObjectsを使用することができます照会、deleteObjectを使用してファイルを削除し、再度listObjectsをチェックしますファイルが確実に削除されたことを確認してください。

私は解決策のいずれかに満足していないですが、彼らはSDK vからの変換では、今

7

のための仕事をする。1.?私はあまりにも、ファイルが削除されたかどうかわからないという問題に遭遇しました。ファイルが削除されたかどうかを私に知らせてくれるすべてについて、->isOK()メソッドが使用されていました。 https://forums.aws.amazon.com/thread.jspa?messageID=455154

は、基本的には、もはやいかなる種類の「やっ削除」フラグがあります:

は、私は最終的にがつがつ食うクリエイターから、この応答につまずきました。 Michael(Guzzle)が示唆しているのは、ファイルが削除されたかどうかを知りたい場合は、->deleteObject()を使い、->doesObjectExist()を実行して削除が成功したかどうかを確認します。

変更の根拠はこれです:新しいアプローチは、それは価値がある何のためなど

、あなたが回答を待たずに、削除要求のトンをオフに解雇することができます。 David

関連する問題