【问题标题】:AWS::S3::Errors::NoSuchKey No Such KeyAWS::S3::Errors::NoSuchKey 没有这样的键
【发布时间】:2015-12-21 07:06:40
【问题描述】:

我有一个在 Heroku 上运行的带有 Paperclip 的 Rails 4 应用程序。我最近开始遇到一个问题,该问题阻止我更新带有附加图像的任何模型。例如,每当我通过我的站点的 CMS 系统对我的Company 模型进行更改时,这些更改都不会保存。我尝试仅更改图像、图像和各种其他属性,以及仅更改非图像属性。好像@company.save 从未在我的控制器的更新操作中被调用。

我找到this issue report 并尝试了建议的各种解决方案,但没有任何效果。

这是我的Company 模型:

class Company < ActiveRecord::Base
    has_attached_file :logo, :styles => { :medium => "300x300>", :thumb => "100x100>" }
    validates_attachment_content_type :logo, :content_type => /\Aimage\/.*\Z/
end

在我的日志中,我收到以下错误:

[AWS S3 404 0.022711 0 retries] head_object(:bucket_name=>"myApp",:key=>"companies/profile_photos/000/000/118/original/2015-09-05_19.05.34.jpg") AWS::S3::Errors::NoSuchKey No Such Key

我验证了我的 S3 凭据是使用 heroku config 设置的,并且它们是有效的。

我不确定,但我怀疑这可能与我最近添加的以下构建包有关:

=== myApp Buildpack URLs
1. https://github.com/bobbus/image-optim-buildpack.git
2. https://github.com/heroku/heroku-buildpack-ruby.git

我无法在 localhost 上重现该问题。

更新

我已经在这个问题上打开了issue report

这是我在production.rd 中的config.paperclip_defaults

config.paperclip_defaults = {
    :storage => :s3,
    :s3_protocol => :https,
    :s3_host_name => 's3.amazonaws.com',
    :s3_credentials => {
        :bucket => ENV['S3_BUCKET_NAME'],
        :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
        :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
    }
}

这是我的aws.yml

development:
  access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
  secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>

production:
  access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
  secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>

【问题讨论】:

    标签: ruby-on-rails heroku amazon-s3 paperclip aws-sdk


    【解决方案1】:

    来自 GitHub 回形针 wiki 的文档

    假设您使用的是 dotenv-rails...

    在 development.rb 和 production.rb 文件中:

    config.paperclip_defaults = {
      storage: :s3,
      s3_host_name: ENV['S3_HOST_NAME'],
      bucket: ENV['S3_BUCKET_NAME']
    }
    

    确保在您的 Heroku 环境中设置这些变量:

    $ heroku config:set S3_HOST_NAME=your-s3-hostname-here S3_BUCKET_NAME=your-production-bucket-name-here
    

    Paperclip-with-Amazon-S3

    来自 ruby​​doc.info 的文档

    这表明您应该有一个指定这些详细信息的 yaml 文件,或者在您的模型上编写一个方法。

    rubydoc.info Paperclip::Storage::S3

    【讨论】:

    • 我刚刚用我的配置块修改了我上面的问题。很相似。从一开始我就有同样的障碍。开发设置也相同,但开发中不会发生错误。
    • 类似,但不一样。
    • 所以我尝试了您的建议,但没有任何区别。有关代码,请参阅我的帖子的编辑。我之前尝试将pry-remote 输入控制器,但无法让pry-remote 工作。
    • 新开发。我想将puts @company.valid?@company.errors 放入控制器中,这表明它验证失败,尽管我还不确定为什么。
    • @company.errors.full_messages 返回什么?由于无法保存关联的图像附件,因此可能无法通过验证。
    【解决方案2】:

    No Such Key 是 S3 表示“404 Not Found”的方式。

    我不相信它有任何其他含义。

    请求已获得授权且语法有效,但指定路径的存储桶中没有文件。

    您可能希望从 AWS 控制台检查存储桶的内容。

    【讨论】:

    • 所以当我检查存储桶时,文件夹companies/profile_photos/00/00/118 不存在。文件夹仅上升到113。我想知道为什么附件没有被保存。我有其他带有回形针附件和相同验证的模型,它们工作得很好。没有引发或记录错误,所以我不知道从哪里开始查找。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    • 2016-06-26
    相关资源
    最近更新 更多