【问题标题】:Delete from S3 bucket with Ruby SDK使用 Ruby SDK 从 S3 存储桶中删除
【发布时间】:2018-01-21 14:17:29
【问题描述】:

我正在尝试使用 AWS SDK for Ruby 在 Rails 应用程序中执行一些 S3 上传、下载和删除。上传和下载工作正常;删的不多。我无休止地在 Google 上搜索并找到了几个“解决方案”,但没有一个真正有效。

我尝试了尝试 #1 的几种变体。我尝试了 delete_objects,尝试传入数组和哈希而不是单个对象名称,尝试传入 key:对象名称等。

尝试 #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
})

【问题讨论】:

    标签: ruby-on-rails amazon-s3 aws-sdk


    【解决方案1】:

    您在代码中的何处定义object_name?另外,如果您只需要与 S3 存储桶交互,我建议您使用更简单的 gem:https://github.com/qoobaa/s3

    【讨论】:

    • 对象的完整 URL 路径存储在实例变量中。我只使用以下方法提取对象名称:self.file_url.split('/')[-1] - 我会检查那个 gem 并报告回来。
    • 报告回来。在重构以使用该 gem 之后,现在可以删除(并且上传和下载没有中断)。该 gem 的一个问题是临时下载 URL 由于某种原因无法反映内容类型,因此文件以二进制形式出现,而在它们之前是图像、PDF 等。我将不得不寻找一种解决方法。跨度>
    【解决方案2】:

    解决方案是使用更简单的 gem:https://github.com/qoobaa/s3。感谢 CV-Gate!

    【讨论】:

      猜你喜欢
      • 2017-03-06
      • 2012-02-14
      • 2018-05-16
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多