簡體   English   中英

使用Ruby SDK從S3存儲桶中刪除

[英]Delete from S3 bucket with Ruby SDK

我正在嘗試使用適用於Ruby的AWS開發工具包在Rails應用程序中執行一些S3上傳,下載和刪除。 上載和下載工作正常; 刪除不多。 我無休止地搜索了Google,發現了幾個“解決方案”,但是它們都不起作用。

我嘗試了嘗試#1的幾種變體。 我嘗試了delete_objects,嘗試傳遞了數組和哈希值而不是單個對象名稱,並嘗試傳遞了鍵:對象名稱,等等。

嘗試1:

def delete_file
  access_key_id = Rails.configuration.app['access_key_id']
  secret_access_key = Rails.configuration.app['secret_access_key']
  credentials = Aws::Credentials.new(access_key_id, secret_access_key)
  Aws.config[:credentials] = credentials
  s3_client = Aws::S3::Client.new(region: Rails.configuration.app['s3_region'], credentials: credentials)
  s3_resource = Aws::S3::Resource.new(client: s3_client)
  bucket = s3_resource.bucket(Rails.configuration.app['s3_bucket'])
  obj = s3_resource.bucket(Rails.configuration.app['s3_bucket']).object(object_name)
  s3_response = obj.delete
  Rails.logger.error("XXX")
  Rails.logger.error(s3_response)
  Rails.logger.error("XXX")
  return s3_response
end

輸出:

XXX
#<struct Aws::S3::Types::DeleteObjectOutput delete_marker=true, version_id="null", request_charged=nil>
XXX

嘗試2:

def delete_file
    access_key_id = Rails.configuration.app['access_key_id']
    secret_access_key = Rails.configuration.app['secret_access_key']
    credentials = Aws::Credentials.new(access_key_id, secret_access_key)
    Aws.config[:credentials] = credentials
    s3_client = Aws::S3::Client.new(region: Rails.configuration.app['s3_region'], credentials: credentials)
    s3_resource = Aws::S3::Resource.new(client: s3_client)
    bucket = s3_resource.bucket(Rails.configuration.app['s3_bucket'])
    s3_response = bucket.delete_objects({
      delete: {
        objects: [
          {
            key: object_name
          }
        ]
      }
    })
    Rails.logger.error("XXX")
    Rails.logger.error(s3_response)
    Rails.logger.error("XXX")
    return s3_response
end

輸出:

XXX
#<struct Aws::S3::Types::DeleteObjectsOutput deleted=[#<struct Aws::S3::Types::DeletedObject key="[object_name]?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=[stuff]%2F20170813%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20170813T164341Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=[stuff]", version_id=nil, delete_marker=true, delete_marker_version_id="null">], request_charged=nil, errors=[]>
XXX

請注意,我正在使用的S3存儲桶已關閉版本控制功能,因此任何上載文件都只有一個版本。 我想從給定存儲桶中完全刪除給定對象名稱。

我正在尋找一種編程方式在Rails 5.1中做到這一點。 謝謝大家

編輯:另外兩次不起作用的嘗試-與嘗試1的輸出相同:

s3_response = s3_client.delete_object({
    bucket: Rails.configuration.app['s3_bucket'],
    key: object_name
})

s3_response = s3_client.delete_object({
    bucket: Rails.configuration.app['s3_bucket'],
    key: full_object_url
})

您在代碼中的哪里定義object_name 另外,如果您只需要與S3存儲桶進行交互,則建議您使用更簡單的gem: https//github.com/qoobaa/s3

解決方案是使用更簡單的gem: https : //github.com/qoobaa/s3 感謝CV-Gate!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM