2015-11-19 14 views
8

Tôi có đoạn code làm việc sau để xóa một đối tượng từ Amazon s3đối tượng Xóa ở s3 sử dụng ký tự đại diện phù hợp với

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

Nhưng những gì tôi muốn làm là để xóa tất cả các file dưới thư mục sử dụng ký tự đại diện **. Tôi biết amazon s3 không xử lý "x/y/file.jpg" như một thư mục y bên trong x nhưng những gì tôi muốn đạt được là bằng cách đề cập đến "x/y *" xóa tất cả các đối tượng tiếp theo có cùng tiền tố. Cố gắng 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) 

Tôi biết trong php nó có thể được thực hiện dễ dàng bằng cách P3-> delete_all_objects theo this answer. Có thể hành động tương tự trong GOlang không.

Trả lời

2

Thật không may gói goamz không có phương pháp tương tự như thư viện PHP delete_all_objects.

Tuy nhiên, mã nguồn cho PHP delete_all_objects có sẵn ở đây (bật tắt nguồn xem): http://docs.aws.amazon.com/AWSSDKforPHP/latest/#m=AmazonS3/delete_all_objects

Dưới đây là những dòng quan trọng của mã:

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(); 

Như bạn có thể thấy, các mã PHP thực tế sẽ thực hiện yêu cầu HTTP trên nhóm để trước tiên nhận tất cả các tệp phù hợp với PCRE_ALL, được xác định elsewhereconst PCRE_ALL = '/.*/i';.

Bạn chỉ có thể xóa 1000 tệp cùng một lúc, do đó, delete_all_objects sau đó tạo một hàm batch để xóa 1000 tệp một lúc.

Bạn phải tạo cùng chức năng trong chương trình đi vì gói goamz chưa hỗ trợ tính năng này. May mắn thay nó chỉ là một vài dòng mã, và bạn có một hướng dẫn từ thư viện PHP.

Có thể bạn nên gửi yêu cầu kéo cho gói goamz khi bạn đã hoàn tất!

+0

Cảm ơn bạn đã nêu ra sự lôi cuốn với aws-sdk – Itachi

1

Sử dụng công cụ mc bạn có thể làm:

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

nó sẽ xóa tất cả các đối tượng với tiền tố "x/y"

Bạn có thể đạt được cùng với Go sử dụng minio-go như thế này :

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) 
    } 
} 
Các vấn đề liên quan