2013-10-23 24 views
6

döndürür PHP için AWS SDK'yı, besteci aracılığıyla yüklenen 2.4.7 sürümünü kullanıyorum. Bir S3 grubundan bir dosyayı sildikten sonra, yanıt nesnesi içindeki DeleteMarker anahtarı, dosya S3'ten silinmiş olsa bile her zaman boştur. Belgeleme, işlem başarılı olursa, DeleteMarker'ın doğru olması gerektiğini belirtir, aksi halde yanlıştır.S3 DeleteObject - DeleteMarker her zaman boş

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

ve yanıttır:

Benim silme çağrıdır

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

Sonra yaparsanız:

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

$ is_deleted hep yanlıştır. Silme işlemi gerçekten başarılı olsa ve dosya S3'ten kaldırılmış olsa bile, DeleteMarker anahtarına karşı herhangi bir değer döndürülmemiş olabilir mi?

GÜNCELLEME:

benim anahtar başlangıcına bir çizgi eklerseniz ben dosya hala S3 kaldırılır rağmen geri sahte bir yanıt almak.

Anahtarı "yol// benim/image.jpg için" DeleteMarker sahip DeleteMarker içinde Anahtar "/path/to/my/image.jpg" sonuç boş değeri olan sonuçlanır

Ama her iki durumda da

sahte boş görüntüler S3 grubundan kaldırılır.

+0

Aynı sorunu yaşıyor. Bunu hiç çözdün mü? – Scott

+0

Hayır, bunu asla çözemedim. Kovada sürüm oluşturmayı etkinleştirmek istemedim, bu yüzden Simon'ın aşağıda önerdiği gibi yaptığım ve silme işleminden sonra dosyanın mevcut olup olmadığını kontrol etmek için ikinci bir çağrı yapıyorum. Başarılı olsaydı veya olmasaydı silmek için bir çağrı yapıp bunu bilirsem daha iyi olurdu. –

cevap

2

Javascript SDK ile aynı sorunu yaşıyorum. Dosya mevcutsa ya da olmasın deleteObject numaralı çağrıya ince (HTTP 204) döndürülür! Bu, dosyanın yanıt kodundan silinip silinmediğini belirtmeyi imkansız hale getirir. Ayrıca, yanıtın yalnızca sürümün etkinleştirilmiş olması durumunda DeleteMarker yanıtı içerdiği görülmektedir (ayrıca bkz. this thread on DeleteMarker).

Bu soruna geçici bir çözüm bulmak için iki olasılık görüyorum.

İlk seçenek olarak, sürümleri etkinleştirebilir ve nesnelerinizi kalıcı olarak silmek için DELETE Object versionID kullanabilirsiniz (see the AWS documentation). Bu veritabanında versionID depolamak ya gerektirebilir veya dosya varsa o önce ikinci seçenek olarak listObjectVersions

kullanarak silme, denetlemek listObjects kullanabilirsiniz sorgulamak, deleteObject kullanarak dosyayı silmek ve yeniden listObjects kontrol edecek dosyanın kesin olarak silinmiş olduğundan emin olun.

Ben çözeltisi ile, memnun değilim, ancak SDK v. 1. dönüştürme Şimdi

7

için işi yapmak? 2'ye. Ben de silinen dosyanın olup olmadığını bilmeme problemine girdim (dosya silinmişse veya olmasaydı bana haber verebilecek olan her şey hakkında ->isOK() yöntemi kullanılırdı). https://forums.aws.amazon.com/thread.jspa?messageID=455154

Temelde, artık herhangi bir tür 'yaptılar sil' seçeneği vardır:

Sonunda guzzle yaratıcısı bu yanıtı tökezledi. Michael'ın (Guzzle) önerdiği şey şudur: Bir dosyanın silinip silinmediğini öğrenmek istiyorsanız, ->deleteObject() kullanın ve ardından silme işleminin başarılı olup olmadığını görmek için ->doesObjectExist()'u çalıştırın.

değişim mantığı şudur: yeni yaklaşım buna değer ne vb

, sen yanıtlar için beklemek zorunda kalmadan silme istekleri tonlarca ateşlemesi sağlar. David

İlgili konular