我正在使用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上提供。)
思考?不是每个人都必须这样做吗?
答案 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