【问题标题】:AWS::S3::Errors::NoSuchKey: No Such Key errorAWS::S3::Errors::NoSuchKey: 没有这样的键错误
【发布时间】:2015-06-02 03:47:37
【问题描述】:

我正在尝试创建一个删除 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"

【问题讨论】:

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


    【解决方案1】:

    假设 ruby​​ 的 awssdk v1。

    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)
    

    刚刚敲出代码,所以想法就在那里,您可能需要稍微更正/完善它

    【讨论】:

    • S3_BUCKET.objects[small_path] 似乎没有返回集合
    【解决方案2】:

    感谢您在上面对@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
    

    【讨论】:

      猜你喜欢
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-02
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多