2013-10-23 89 views
6

我正在使用AWS SDK for PHP,通過編寫器安裝版本2.4.7。從S3存儲桶刪除文件後,響應對象中的DeleteMarker鍵始終爲空,即使文件實際上已從S3中刪除。該文檔指出,如果操作成功,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永遠是假的。即使刪除操作實際上成功並且文件已從S3中刪除,對於DeleteMarker鍵來說,沒有返回值是怎麼回事?

UPDATE:

如果我添加斜線到我的鑰匙開始我得到的假回來,即使文件仍從S3取出的響應。

鍵「路徑/要/我的/ image.jpg的」產生了具有DeleteMarker空值 鍵「/path/to/my/image.jpg」導致DeleteMarker具有空虛假

但在這兩種情況下,圖像將從S3存儲桶中刪除。

+0

有同樣的問題。你有沒有解決這個問題? – Scott

+0

不,我從來沒有解決這個問題。我不想在桶上啓用版本控制,因此我只是按照Simon在下面的建議進行操作,並在刪除調用後發出第二個調用來檢查文件是否存在。這並不理想,因爲如果我可以打一個電話來刪除並知道它是否成功,它會更好。 –

回答

2

我遇到了與JavaScript SDK相同的問題。無論文件是否存在,對deleteObject的調用都會返回正常(HTTP 204)!這使得無法判斷文件是否從響應代碼中刪除。此外,如果存儲桶啓用了版本控制,則似乎響應僅包括DeleteMarker(另請參閱this thread on DeleteMarker)。

我看到兩種可能性來解決這個問題。

作爲第一個選項,您可以啓用版本控制並使用DELETE Object versionID來永久刪除您的對象(see the AWS documentation)。這需要你要麼存儲versionID在您的數據庫,或查詢其之前使用listObjectVersions

至於第二個選項刪除,你可以使用listObjects來檢查文件是否存在,使用deleteObject刪除該文件,並再次檢查listObjects到確保文件已被刪除。

我並不滿足於任何一個解決方案,但他們做的工作現在

7

在從SDK v 1。轉換?到2,我也遇到了不知道文件是否被刪除的問題(以前有關於文件被刪除或不被刪除的所有東西都會使用->isOK()方法)。

我終於偶然從狂飲創造者這樣的響應:https://forums.aws.amazon.com/thread.jspa?messageID=455154

基本上不再有任何形式的「做了刪除」標誌。 Michael(Guzzle)建議這樣做:如果您想知道是否刪除了文件,請使用->deleteObject(),然後運行->doesObjectExist()以查看刪除是否成功。

,這一變化主要原理是這樣的:新的方法可以讓你火了噸的刪除請求,而無需等待答覆,等

對於它的價值。 大衛