通过Rails Aws API 2从Amazon S3删除对象

时间:2015-03-05 00:49:54

标签: ruby-on-rails amazon-web-services amazon-s3

我正在使用s3_direct_upload gem在亚马逊s3上存储图片和视频。当图像或视频被更改或删除时,我想在s3上修改旧图像或视频,并为每个人节省金钱和空间。

此解决方案使用V1 Aws SDK并且不再有效:

http://blog.littleblimp.com/post/53942611764/direct-uploads-to-s3-with-rails-paperclip-and

此解决方案删除最初在批处理中上传的文件,但不对后处理的最终文件执行任何操作:

github - waynehoover / s3_direct_upload

这是Aws v2 SDK doc,看起来很清楚:

http://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Client.html#delete_object-instance_method

然而这个解决方案:

class Image < ActiveRecord::Base

  validates :name, :s3_image_file_url, :s3_image_file_path, :s3_image_file_key, presence: true

  before_destroy :delete_s3_files

  private
    def delete_s3_files
      s3 = Aws::S3::Client.new()
      response = s3.delete_object(
        bucket: Rails.configuration.aws[:bucket],
        key: self.s3_image_file_key
      )
    end
end

...仅返回:

=> #<struct  delete_marker=nil, version_id=nil>

(该文件仍然在原始网址的s3上提供。)

思考?不是每个人都必须这样做吗?

2 个答案:

答案 0 :(得分:0)

我使用v2 SDK编写代码来从S3中删除对象。以下是我的代码库中的示例:

def delete_avatar_from_s3
  Aws::S3::Client.new.delete_object(
    bucket: "user-avatars",
    key: "#{@id}"
  )
  return true
  rescue => e
    Rails.logger.error "Error deleting avatar of user #{@id}. Failure with S3 call. Details: #{e}; #{e.backtrace}"
    return false
end

它看起来与你的相似,所以我不认为这个代码是个问题。你有没有确认你的水桶和水桶?键名并确保您的方法实际被调用?

答案 1 :(得分:0)

适用于Ruby V2的AWS开发工具包

删除一个或多个文件,只需传递包含密钥的objects数组。

def delete_from_s3
 S3_BUCKET.delete_objects({
    delete: {
     objects: [
        {key: key}
        ]
      }  
    })
end