【问题标题】:Rails AWS S3: Downloading File and Storing in Temp FolderRails AWS S3:下载文件并存储在临时文件夹中
【发布时间】:2014-04-23 22:44:28
【问题描述】:

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

以下代码返回此错误:OpenURI::HTTPError (301 Moved Permanently (Invalid Location 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 中存在限制,即如果您创建的存储桶不是“美国标准”,则不能在存储桶地址中使用路径样式语法。”

但是,我检查了这个存储桶,它是 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)

但是,从以下代码创建的 url 确实会指向声音文件。

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

想法?

【问题讨论】:

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


    【解决方案1】:

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

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

    第二件事是重定向。当您连接时,您将被重定向到俄勒冈州,因为您将看到的典型 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/

    另一件事是,我看到有人抱怨重定向 URL 格式不正确。虽然我无法复制该行为,但我会尝试将请求发送到俄勒冈端点,看看这是否能解决您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-20
      • 2020-01-25
      • 1970-01-01
      • 2016-12-22
      • 1970-01-01
      • 2019-02-16
      • 2019-09-06
      • 2019-11-25
      相关资源
      最近更新 更多