【问题标题】:Amazon s3, Paperclip, Heroku - trying to make it workAmazon s3、Paperclip、Heroku - 试图让它发挥作用
【发布时间】:2015-10-10 16:44:40
【问题描述】:

我在使用 Amazon s3 管理通过 Heroku 上传的 Paperclip 图像时遇到问题。我是新手,需要帮助。

我的 Gemfile 是这样配置的:

gem 'paperclip', '~> 4.3.0'

gem 'aws-sdk', '< 2'

我已经用谷歌搜索了这个问题,我确定存储桶和所需的密钥已按应有的方式配置。下面是错误信息。

2015-10-10T15:42:22.470342+00:00 app[web.1]:    (1.4ms)  BEGIN
2015-10-10T15:42:22.538108+00:00 app[web.1]:   SQL (1.3ms)  INSERT INTO "pins" ("description", "image_file_name", "image_content_type", "image_file_size", "image_updated_at", "user_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING "id"  [["description", "huggable dog"], ["image_file_name", "huskie.jpg"], ["image_content_type", "image/jpeg"], ["image_file_size", 107437], ["image_updated_at", "2015-10-10 15:42:21.625762"], ["user_id", 3], ["created_at", "2015-10-10 15:42:22.532123"], ["updated_at", "2015-10-10 15:42:22.532123"]]
2015-10-10T15:42:23.614978+00:00 heroku[router]: at=info method=POST path="/pins" host=pixblog.herokuapp.com request_id=a95e7cb8-bfd6-4de9-9e76-51f697f1b5d0 fwd="50.185.53.42" dyno=web.1 connect=1ms service=2468ms status=500 bytes=1754
2015-10-10T15:42:23.607308+00:00 app[web.1]:    (1.7ms)  ROLLBACK
2015-10-10T15:42:23.610744+00:00 app[web.1]: 
2015-10-10T15:42:23.610748+00:00 app[web.1]: ArgumentError (missing required :bucket option):
2015-10-10T15:42:23.610749+00:00 app[web.1]:   app/controllers/pins_controller.rb:31:in `create'
2015-10-10T15:42:23.610751+00:00 app[web.1]: 
2015-10-10T15:42:23.610752+00:00 app[web.1]: 
2015-10-10T15:42:23.608813+00:00 app[web.1]: Completed 500 Internal Server Error in 2004ms (ActiveRecord: 5.8ms)
updating Heroku CLI...Update hash signature mismatch
/Users/DigitalEtchings/.heroku/client/lib/heroku/updater.rb:10:in `error'
/Users/DigitalEtchings/.heroku/client/lib/heroku/updater.rb:127:in `block (2 levels) in update'
/usr/local/heroku/ruby/lib/ruby/1.9.1/tmpdir.rb:83:in `mktmpdir'
/Users/DigitalEtchings/.heroku/client/lib/heroku/updater.rb:116:in `block in update'
/Users/DigitalEtchings/.heroku/client/lib/heroku/updater.rb:88:in `wait_for_lock'
/Users/DigitalEtchings/.heroku/client/lib/heroku/updater.rb:112:in `update'
/Users/DigitalEtchings/.heroku/client/lib/heroku/updater.rb:101:in `autoupdate'
/Users/DigitalEtchings/.heroku/client/lib/heroku/cli.rb:28:in `start'
/usr/local/bin/heroku:24:in `<main>'

我理解指向pins_controller.rb 的参数错误,该页面上的代码处理图像上传的结果——这没有发生。帮忙?

【问题讨论】:

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


    【解决方案1】:

    我已经对此here进行了解释

    它应该可以让你设置回形针、S3 和 Heroku。

    【讨论】:

    • 太棒了。我没有错误了。一切都差不多了。几乎。图片不显示! (他们应该在的地方只有一个问号。)我检查了亚马逊控制台,图像就在那里。现在可能是什么问题?我现在就睡这个,但我觉得我已经过了驼峰。非常感谢,感谢您的帮助。
    • 如果存储桶中有图像,这意味着您的应用程序中的机制有效。可能有多种原因导致它们未显示。我将从检查我的存储桶权限开始。接下来,我如何在视图中显示它们。
    【解决方案2】:

    ArgumentError(缺少必需的 :bucket 选项):

    该错误仅表示您没有为您的应用中的Paperclip 实例设置选项。

    有一个great tutorial here

    您需要执行以下操作:

    #config/environments/production.rb
    config.paperclip_defaults = {
      storage: :s3,
      s3_credentials: {
        access_key_id: ENV['AWS_ACCESS_KEY_ID'],
        secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
      }
      bucket: ENV['S3_BUCKET_NAME']
    }
    

    然后结合HerokuENV变量赋值如下:

    $ heroku config:set S3_BUCKET_NAME=your_bucket_name
    $ heroku config:set AWS_ACCESS_KEY_ID=your_access_key_id
    $ heroku config:set AWS_SECRET_ACCESS_KEY=your_secret_access_key
    

    在 Rails 4+ 中,您最适合使用他们的config/secrets.rb hash

    #config/secrets.rb
    production:
       s3:
         :bucket: "bucket_name"
         :access: "access_key_id"
         :secret: "secret_access_key"
    

    这将使您能够参考:

    #config/application.rb
    config.paperclip_defaults = {
      storage: :s3,
      s3_credentials: {
        access_key_id:      Rails.application.secrets.s3[:access],
        secret_access_key:  Rails.application.secrets.s3[:sercret]
      }
      bucket: Rails.application.secrets.s3[:bucket]
    }
    

    这样做的好处是您可以使用 ENV 变量填充您的 secrets

    #config/secrets.rb
    development: 
       s3:
         :bucket: "dev_bucket_name"
         :access: "access_key_id"
         :secret: "secret_access_key"
    production:
       s3:
         :bucket: ENV["AMAZON_S3_BUCKET"]
         :access: ENV["AMAZON_ACCESS_KEY_ID"]
         :secret: ENV["AMAZON_SECRET_ACCESS_KEY"]
    

    我们发现标准Heroku 推荐存在一个小问题;您需要在s3_credentials 散列之外包含paperclipbucket 选项:


    关于未显示的图像,存在许多潜在问题:

    上传

    你的图片真的被上传了吗?

    最简单的检查方法是转到您的 S3 帐户并查找它们。如果它们在那里,则表明您有权限/ Rails 问题阻止它们显示;如果没有,则意味着您将遇到其他问题。

    根据您发布的内容,我强烈建议您浏览您的 Heroku 日志。如果您不喜欢浏览大量文本,您可能希望将 LogEntries 添加到您的应用程序中 - 它允许您查看 live 提要,它会为您提供来自 Rails 的明确日志。

    导轨

    Rails 更常见的问题之一是它仍会尝试从本地目的地加载资产。我们总是使用s3_host_name 来指定Paperclip 将从中提取数据的主机。

    这是一个特别是欧洲桶的问题 - 我们通过定义 s3_host_name 解决了这个问题,如您在上面看到的。

    【讨论】:

      猜你喜欢
      • 2016-05-23
      • 1970-01-01
      • 2011-06-06
      • 2020-09-04
      • 1970-01-01
      • 2021-02-26
      • 2011-03-07
      • 1970-01-01
      • 2012-06-06
      相关资源
      最近更新 更多