AWS::S3::Errors::NoSuchKey: No Such Key 错误
AWS::S3::Errors::NoSuchKey: No Such Key error
我正在尝试创建一个删除 S3 实例上文件的方法,但是当我尝试调用 .head
或 .read
时出现 AWS::S3::Errors::NoSuchKey: No Such Key
错误一个对象。
app/models/file_item.rb
def thumbnail
{
exists: thumbnailable?,
small: "http://#{bucket}.s3.amazonaws.com/images/#{id}/small_thumb.png",
large: "http://#{bucket}.s3.amazonaws.com/images/#{id}/large_thumb.png"
}
end
lib/adapters/amazons3/accessor.rb
module Adapters
module AmazonS3
class Accessor
S3_BUCKET = AWS::S3.new.buckets[ENV['AMAZON_BUCKET']]
...
def self.delete_file(thumbnail)
prefix_pattern = %r{http://[MY-S3-HOST]-[a-z]+.s3.amazonaws.com/}
small_path = thumbnail[:small].sub(prefix_pattern, '')
large_path = thumbnail[:large].sub(prefix_pattern, '')
small = S3_BUCKET.objects[small_path]
large = S3_BUCKET.objects[large_path]
binding.pry
S3_BUCKET.objects.delete([small, large])
end
end
end
end
示例 url1
"http://projectname-staging.s3.amazonaws.com/images/994/small_thumb.png"
示例 url2
"http://projectname-production.s3.amazonaws.com/images/994/large_thumb.png"
假设 awssdk v1 用于 ruby。
small = S3_BUCKET.objects[small_path]
实际上没有得到任何对象。
来自:https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/Bucket.html
bucket.objects['key'] #=> makes no request, returns an S3Object
bucket.objects.each do |obj|
puts obj.key
end
因此您需要将代码更改为:
to_delete = []
S3_BUCKET.objects[small_path].each do |obj|
to_delete << obj.key
end
S3_BUCKET.objects[large_path].each do |obj|
to_delete << obj.key
end
S3_BUCKET.objects.delete(to_delete)
刚敲出代码,所以想法就在那里,你可能需要correct/polish一点
多亏了上面@Mircea 的回答,我才能够想出一种不同的解决方案。
def self.delete_file(thumbnail)
folder = thumbnail[:small].match(/(\d+)(?!.*\d)/)
to_delete = []
S3_BUCKET.objects.with_prefix("images/#{folder}").each do |thumb|
to_delete << thumb.key
end
# binding.pry
S3_BUCKET.objects.delete(to_delete)
end
我正在尝试创建一个删除 S3 实例上文件的方法,但是当我尝试调用 .head
或 .read
时出现 AWS::S3::Errors::NoSuchKey: No Such Key
错误一个对象。
app/models/file_item.rb
def thumbnail
{
exists: thumbnailable?,
small: "http://#{bucket}.s3.amazonaws.com/images/#{id}/small_thumb.png",
large: "http://#{bucket}.s3.amazonaws.com/images/#{id}/large_thumb.png"
}
end
lib/adapters/amazons3/accessor.rb
module Adapters
module AmazonS3
class Accessor
S3_BUCKET = AWS::S3.new.buckets[ENV['AMAZON_BUCKET']]
...
def self.delete_file(thumbnail)
prefix_pattern = %r{http://[MY-S3-HOST]-[a-z]+.s3.amazonaws.com/}
small_path = thumbnail[:small].sub(prefix_pattern, '')
large_path = thumbnail[:large].sub(prefix_pattern, '')
small = S3_BUCKET.objects[small_path]
large = S3_BUCKET.objects[large_path]
binding.pry
S3_BUCKET.objects.delete([small, large])
end
end
end
end
示例 url1
"http://projectname-staging.s3.amazonaws.com/images/994/small_thumb.png"
示例 url2
"http://projectname-production.s3.amazonaws.com/images/994/large_thumb.png"
假设 awssdk v1 用于 ruby。
small = S3_BUCKET.objects[small_path]
实际上没有得到任何对象。
来自:https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/Bucket.html
bucket.objects['key'] #=> makes no request, returns an S3Object
bucket.objects.each do |obj|
puts obj.key
end
因此您需要将代码更改为:
to_delete = []
S3_BUCKET.objects[small_path].each do |obj|
to_delete << obj.key
end
S3_BUCKET.objects[large_path].each do |obj|
to_delete << obj.key
end
S3_BUCKET.objects.delete(to_delete)
刚敲出代码,所以想法就在那里,你可能需要correct/polish一点
多亏了上面@Mircea 的回答,我才能够想出一种不同的解决方案。
def self.delete_file(thumbnail)
folder = thumbnail[:small].match(/(\d+)(?!.*\d)/)
to_delete = []
S3_BUCKET.objects.with_prefix("images/#{folder}").each do |thumb|
to_delete << thumb.key
end
# binding.pry
S3_BUCKET.objects.delete(to_delete)
end