2015-11-19 13 views
8

Ho il seguente codice di lavoro per eliminare un oggetto da Amazon S3oggetti Elimina nella s3 utilizzando jolly corrispondenza

params := &s3.DeleteObjectInput{ 
     Bucket: aws.String("Bucketname"), 
     Key : aws.String("ObjectKey"), 
    } 
s3Conn.DeleteObjects(params) 

ma quello che voglio fare è quello di eliminare tutti i file in una cartella utilizzando jolly **. So che amazon s3 non tratta "x/y/file.jpg" come una cartella y dentro x ma quello che voglio ottenere è menzionando "x/y *" cancella tutti gli oggetti successivi che hanno lo stesso prefisso. Provato amazon multi object delete

params := &s3.DeleteObjectsInput{ 
     Bucket: aws.String("BucketName"), 
     Delete: &s3.Delete{ 
      Objects: []*s3.ObjectIdentifier { 
       { 
        Key : aws.String("x/y/.*"), 
       }, 
      }, 
     }, 
    } 
    result , err := s3Conn.DeleteObjects(params) 

So in PHP che può essere fatto facilmente S3-> delete_all_objects secondo this answer. È la stessa azione possibile in GOlang.

risposta

2

Sfortunatamente il pacchetto goamz non ha un metodo simile a quello della libreria PHP delete_all_objects.

Tuttavia, il codice sorgente per il PHP delete_all_objects è disponibile qui (commutazione visualizza sorgente): http://docs.aws.amazon.com/AWSSDKforPHP/latest/#m=AmazonS3/delete_all_objects

Ecco le importanti linee di codice:

public function delete_all_objects($bucket, $pcre = self::PCRE_ALL) 
{ 
// Collect all matches 
    $list = $this->get_object_list($bucket, array('pcre' => $pcre)); 

    // As long as we have at least one match... 
    if (count($list) > 0) 
    { 
     $objects = array(); 

     foreach ($list as $object) 
     { 
      $objects[] = array('key' => $object); 
     } 

     $batch = new CFBatchRequest(); 
     $batch->use_credentials($this->credentials); 

     foreach (array_chunk($objects, 1000) as $object_set) 
     { 
      $this->batch($batch)->delete_objects($bucket, array(
       'objects' => $object_set 
      )); 
     } 

     $responses = $this->batch($batch)->send(); 

Come si può vedere, il codice PHP effettuerà effettivamente una richiesta HTTP sul bucket per ottenere innanzitutto tutti i file corrispondenti a PCRE_ALL, che è definito come const PCRE_ALL = '/.*/i'; come elsewhere.

È possibile eliminare solo 1000 file contemporaneamente, quindi delete_all_objects crea quindi una funzione batch per eliminare 1000 file alla volta.

È necessario creare la stessa funzionalità nel programma go poiché il pacchetto goamz non lo supporta ancora. Fortunatamente dovrebbero essere solo poche righe di codice e tu hai una guida dalla libreria PHP.

Una volta terminato, potrebbe valere la pena di inviare una richiesta di pull per il pacchetto goamz!

+0

Grazie di aver sollevato un tiro con aws-sdk – Itachi

1

Utilizzando lo strumento mc si può fare:

mc rm -r --force https://BucketName.s3.amazonaws.com/x/y

cancellerà tutti gli oggetti con il prefisso "x/y"

È possibile ottenere lo stesso con Go usando minio-go come questo :

package main 

import (
    "log" 

    "github.com/minio/minio-go" 
) 

func main() { 
    config := minio.Config{ 
     AccessKeyID:  "YOUR-ACCESS-KEY-HERE", 
     SecretAccessKey: "YOUR-PASSWORD-HERE", 
     Endpoint:  "https://s3.amazonaws.com", 
    } 
    // find Your S3 endpoint here http://docs.aws.amazon.com/general/latest/gr/rande.html 

    s3Client, err := minio.New(config) 
    if err != nil { 
     log.Fatalln(err) 
    } 
    isRecursive := true 
    for object := range s3Client.ListObjects("BucketName", "x/y", isRecursive) { 
     if object.Err != nil { 
      log.Fatalln(object.Err) 
     } 
     err := s3Client.RemoveObject("BucketName", object.Key) 
     if err != nil { 
      log.Fatalln(err) 
      continue 
     } 
     log.Println("Removed : " + object.Key) 
    } 
} 
Problemi correlati