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