【问题标题】:Special characters in filename affecting aws-sdk ruby gem url_for method影响 aws-sdk ruby​​ gem url_for 方法的文件名中的特殊字符
【发布时间】:2014-03-01 00:38:23
【问题描述】:

我正在为 S3 使用官方的 AWS ruby​​ gem,但在对其中包含特殊字符(即逗号、撇号)的文件使用“url_for”方法时遇到了问题。我正在为 ruby​​ 使用最新的 aws-sdk gem,我的代码如下所示:

s3 = AWS::S3::new
bucket = s3.buckets[bucket]
object = bucket.objects[object_address]
object_url = object.url_for(:read, :expires => 60*60, :secure => true)

对象被正确找到,但我从 url_for 获得的 URL 给了我一个 HTTPError: 404 Not Found 错误。如果文件名中没有逗号或撇号,它可以正常工作。

有没有一种方法可以在不需要限制文件名的情况下处理这个问题?

【问题讨论】:

  • 您的网址是什么样的?
  • 为了隐私,我已经更换了一些部分,但这就是它的要点。它也以 https 开头... //mybucket.s3.amazonaws.com/mypathstuff/test%2Ctest.png?AWSAccessKeyId=MYACCESSKEY&Expires=1323005992&Signature=lettersandnumbers%2Bt2RtdCnBAA%3D
  • 我替换的部分是“mybucket”、“mypathstuff”和“lettersandnumbers”。我已尝试对 URL 进行编码/解码,但没有任何好处。

标签: ruby-on-rails ruby ruby-on-rails-3 amazon-s3


【解决方案1】:

您是否默认转义 URL 字符串?例如:

object_url =  CGI.escape(object.url_for(:read, :expires => 60*60, :secure => true))

这会正确地将字符串转义为浏览器可读的格式。我对我所有的安全 S3 URL 都执行此操作,因为签名中有时会出现 /+ 字符,如果未正确转义,也会导致链接失败。这也将正确地转义逗号和撇号。

【讨论】:

  • 我试过有没有转义,好像没关系。
  • url_for 方法是抛出异常 (HTTPError) 还是只是在您尝试单击显示 404 页面的链接时?
  • 当我点击链接时,我得到了 404 页面。
【解决方案2】:

我最近遇到了同样的问题。我无法在提交之前修复文件名,所以我最终没有使用#url_for,而是编写了自己的编码器。这并不太难,虽然在aws-sdk gem 中不太适用,但很烦人。

这是我的解决方案

def url_for_read(path, opts)
  expire_date = (Time.zone.now + opts[:expires]).to_i
  request_string = "GET\n\n\n#{expire_date}\n/#{config[:bucket]}/#{path}"
  hmac = OpenSSL::HMAC.digest(digest, config[:secret_access_key], request_string)
  signature = URI.escape(Base64.encode64(hmac).strip)
  s3_url_domain + "#{path}?AWSAccessKeyId=#{config[:access_key_id]}&Expires=#{expire_date}&Signature=#{CGI::escape(signature)}"
end

这假设您在 config 哈希中拥有您的 aws 信息,digest 这里是一个“sha1”并且域看起来像 https://<my_bucket>.s3-<region>.amazonaws.com。对于完整的课程,您可以查看此要点https://gist.github.com/bunnymatic/9274108

【讨论】:

  • 在我的例子中,<StringToSign> 在内容类型之后期待 2 个新行(不是 3 个)。在这种情况下,来自 AWS 服务器的响应非常有用,而且我还必须对文件名进行 URL 编码。
猜你喜欢
  • 2012-02-11
  • 2021-06-14
  • 2012-05-12
  • 1970-01-01
  • 2011-12-19
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多