Carrierwave fog Amazon S3 图片未显示

20

我已经安装了Carrierwave和Fog,在第一次成功上传并查看图像后,现在它不再显示图像。

这是我的配置文件 app/config/initializers/carrierwave.rb

CarrierWave.configure do |config|
  config.fog_credentials = {
    :provider               => 'AWS',                                       # required
    :aws_access_key_id      => 'AKIAJKOHTE4WTXCCXAMA',                      # required
    :aws_secret_access_key  => 'some secret key here',                      # required
    :region                 => 'eu-east-1',                                 # optional, defaults to 'us-east-1'
    :host                   => 'https://s3.amazonaws.com',                  # optional, defaults to nil
    :endpoint               => 'https://s3.amazonaws.com:8080'              # optional, defaults to nil
  }
  config.fog_directory  = 'createmysite.co.za'                    # required
  config.fog_public     = false                                   # optional, defaults to true
  #config.fog_attributes = {'Cache-Control'=>'max-age=315576000'} # optional, defaults to {}
end

这就是应该显示图像的URL的外观

<img alt="Normal_selection_003" src="https://createmysite.co.za.s3.amazonaws.com/uploads/portfolio/image/3/normal_Selection_003.png?AWSAccessKeyId=AKIAJKOHTE4WTXCCXAMA&amp;Signature=8PLq8WCkfrkthmfVGfXX9K6s5fc%3D&amp;Expires=1354859553">

当我打开图像URL时,这是来自亚马逊的输出: https://createmysite.co.za.s3.amazonaws.com/uploads/portfolio/image/3/normal_Selection_003.png?AWSAccessKeyId=AKIAJKOHTE4WTXCCXAMA&Signature=8PLq8WCkfrkthmfVGfXX9K6s5fc%3D&Expires=1354859553

<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>3F179B7CE417BC12</RequestId>
<HostId>
zgh46a+G7UDdpIHEEIT0C/rmijShOKAzhPSbLpEeVgUre1iDc9f7TSOwaJdQpR65
</HostId>
</Error>

更新

新的配置文件(添加了fog url过期时间)app/config/initializers/carrierwave.rb

CarrierWave.configure do |config|
  config.fog_credentials = {
    :provider               => 'AWS',                                       # required
    :aws_access_key_id      => 'AKIAJKOHTE4WTXCCXAMA',                      # required
    :aws_secret_access_key  => 'chuck norris',  # required
  }
  config.fog_directory  = 'createmysite.co.za'                              # required
  config.fog_public     = false                                             # optional, defaults to true
  config.fog_authenticated_url_expiration = 600                             # (in seconds) => 10 minutes
end

运行得非常好!

1个回答

29

您已将config.fog_public设置为false并使用Amazon S3进行存储。通过S3访问私有文件的URL是临时的(它们是签名并具有过期时间)。特别地,发布在您问题中的URL带有Expires=1354859553参数。

1354859553Fri, 07 Dec 2012 05:52:33 GMT,与当前时间相比已经过去了,因此链接已经到期,这就是为什么您收到了Access Denied错误的原因。

您可以通过设置将到期时间延长到更长时间(默认为600秒):

config.fog_authenticated_url_expiration = ... # some integer here

如果您想要不过期的链接,请执行以下操作之一:

  • config.fog_public设置为true
  • 让您的应用程序作为中间人,通过send_file提供文件,这里至少有一个关于此内容的SO问题

嗨,这听起来正确!我一定是有什么问题搞砸了,哈哈!我会发布更新的。 - Francois
1
哈哈,我的开发和生产环境有不同的数据库,所以本地图片无法显示,我拉取了生产环境的数据库,现在看起来运行得非常好。谢谢! - Francois
如果我在我的应用程序上载并发布图像时将fog_public从false更改为true,我该如何正确运行这些图像?重新处理它们吗? - bcackerman
1
你需要更改这些对象的ACL以允许“所有人”查看权限。一种方法是编写一个小脚本(甚至可以通过Rails应用程序中的rake任务)来迭代存储桶中的对象,将每个标记为公共的。请查看fog gem中的acl =。您只需为每个文件设置为“public-read”,然后调用save即可。可能有一种更简单的方法直接通过AWS面板完成,但是您可以看到使用此gem有多简单。 - deefour
谢谢,这对我解决了相同的一般问题。 - Ryan Rebo
@deefour,您能告诉我fog_authenticated_url_expiration的最大过期时间吗? - Siva Ganesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接