我正在尝试从我的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
思想?
答案 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端点以查看是否可以解决您的问题。