2017-08-13 88 views
0

我正在嘗試使用適用於Ruby的AWS開發工具包在Rails應用程序中執行一些S3上傳,下載和刪除操作。上傳和下載工作正常;刪除不是很多。我已經無休止地谷歌搜索,並找到了幾個「解決方案」,但沒有一個真正的工作。使用Ruby SDK從S3存儲桶中刪除

我嘗試了嘗試#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 
}) 

回答

0

你是哪裏定義在代碼object_name?此外,如果您只需要與S3存儲桶進行交互,我會向您推薦一個更簡單的創業板:https://github.com/qoobaa/s3

+0

該對象的完整URL路徑存儲在一個實例變量中。我只用對象名稱:self.file_url.split('/')[ - 1] - 我會檢查出該寶石並報告回來。 –

+0

回報。重構後使用該寶石,現在刪除工程(上傳和下載沒有中斷)。這個寶石的一個問題是臨時的下載URL由於某種原因不能反映內容類型,所以文件以二進制形式出現,而在它們是圖像,PDF等之前,我必須考慮解決方法。 –

相關問題