Rails AWS S3:下载文件并存储在临时文件夹中

时间:2014-04-23 22:44:29

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

我正在尝试从我的AWS桶下载文件并将其存储在我的临时文件夹中。

以下代码返回此错误:OpenURI :: HTTPError(301永久移动(无效位置URI)):

@filename是存储桶中的文件名,包括扩展名,作为字符串。

S3 =  AWS::S3.new(
  :access_key_id => ENV["AWS_ACCESS_KEY_ID"],
  :secret_access_key => ENV["AWS_SECRET_ACCESS_KEY"]
)

BUCKET = S3.buckets["name_of_bucket"]

File.open(Rails.root.join("tmp",@filename), "wb") do |file|
 file.write open(BUCKET.objects[@filename].url_for(:read)).read
end

这是我到目前为止所发现的:

puts BUCKET.objects['name_of_bucket']
puts BUCKET.objects['name_of_bucket'].url_for(:read)

第一个BUCKET调用返回正确的对象,第二个返回:

https://ekohotstorage.s3-us-west-2.amazonaws.com/location_info

当您转到该网址时,这是返回的内容

The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.

这个(http://www.sitefinity.com/developer-network/forums/set-up-installation/amazon-s3---must-be-addressed-using-the-specified-endpoint)声明“S3中存在限制,如果您创建的存储桶不是”US Standard“,则不能在存储区地址中使用路径样式语法。”

但是,我已经检查了这个桶,它是def。地区美国标准。

编辑:

我是愚蠢的;我读过AWS的默认值是美国标准。但西方不是标准的,东方是这样的,我猜它不会违反美国标准。

解决了这种愚蠢行为
S3 =  AWS::S3.new(
  :access_key_id => ENV["AWS_ACCESS_KEY_ID"],
  :secret_access_key => ENV["AWS_SECRET_ACCESS_KEY"],
  :region => "us-east-1"
)

我现在收到此错误:

OpenURI::HTTPError (404 Not Found)

但是,从下面的代码创建的网址会导致声音文件。

BUCKET.objects['name_of_bucket'].url_for(:read)

所以问题必须在于

File.open(Rails.root.join("tmp",@filename), "wb") do |file|
 file.write open(BUCKET.objects[@filename].url_for(:read)).read
end

思想?

1 个答案:

答案 0 :(得分:4)

这里似乎有两件事情。首先,美国标准区域实际上是弗吉尼亚州或俄勒冈州。你只需要意识到你被重定向,因为亚马逊选择了俄勒冈作为你的桶。解释区域的URL目前在这里:

http://docs.aws.amazon.com/AmazonS3/latest/dev/LocationSelection.html

第二件事是重定向。当您连接时,您将被重定向到Oregon,因为您将看到的典型S3端点是延迟DNS最接近的端点。当您稍后在弗吉尼亚州进行硬编码时,您看不到您在俄勒冈州的存储桶。

Amazon在此处提供了一些有关S3如何重定向您以及如何处理此问题的文档。

http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTRedirect.html

由于您使用的是工具包而不是API,因此我没有在ruby forge或Amazon文档中看到任何具体内容,这些内容可以说明为什么不遵循重定向。看起来好像去年使用AWS ruby​​ SDK的其他人有这个问题。它可以在较新版本中修复。

我所指的文档在这里:

http://amazon.rubyforge.org/doc/

亚马逊似乎有更新的文档:

http://docs.aws.amazon.com/AWSRubySDK/latest/

另一件事是我看到有关重定向网址格式错误的投诉。虽然我无法复制该行为,但我会尝试将请求发送到Oregon端点以查看是否可以解决您的问题。