【发布时间】: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