【问题标题】:Amazon S3 Access Denied when reading S3 bucket files with "+" sign读取带有“+”号的 S3 存储桶文件时,Amazon S3 访问被拒绝
【发布时间】:2013-04-30 19:22:32
【问题描述】:

我正在开发一个使用带有雾存储的carrierwave 的rails 应用程序。我的表单中有几个字段,用户可以在其中提交应用程序(名称、短描述和长描述、图像字段)。上传文件的名称是从我的表单的“名称”字段中的名称中获取的。

例如,当我上传一个名为 Notepad 的文件时,一切正常,图像显示在我的应用程序页面上。但是,当我在表单字段中上传名称为 Notepad++ 的图像时,它会成功上传到亚马逊,但我得到一个损坏的图像。查看其来源并尝试打开其 url 会产生错误

<Error>
   <Code>AccessDenied</Code>
   <Message>Access Denied</Message>
   <RequestId>0DBACCF4C0301B02</RequestId>
   <HostId>
      raYVzr9xubG0NA/b57saIJzfc2YhnvhD0tafYmo34ewOBY6/0j1AKUFC/lEoY+6h
   </HostId>
</Error>

所有带有加号的名称都会出现这种情况。可能是什么问题呢。我已经尝试了我能做的一切,但一无所获。这是我的 image_uploader 类

# encoding: utf-8

class ImageUploader < CarrierWave::Uploader::Base

   include CarrierWave::RMagick

   storage :fog

   include CarrierWave::MimeTypes
   process :set_content_type

   def store_dir
      "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.name.to_s.downcase.underscore || model.id.to_s.underscore.downcase}"
   end

   def filename
      "#{model.name.to_s.underscore.downcase}-#{secure_token}" if original_filename.present?
   end

   def default_url
      "fallback/#{model.class.to_s.underscore}/" + [version_name, "noimage.gif"].compact.join('_')
   end

   version :nano_thumb do
       process :resize_to_fill => [20, 20]
   end

   version :mini_thumb do
       process :resize_to_fill => [25, 25]
   end

   version :small_thumb do
       process :resize_to_fill => [34, 34]
   end

   version :thumb do
      process :resize_to_fill => [48, 48]
   end

   version :small do
      process :resize_to_fill => [86, 86]
   end

   version :medium do
       process :resize_to_fill => [259, 259]
   end

   version :large do
       process :resize_to_fill => [518, 518]
   end

   def extension_white_list
      ["jpg", "jpeg", "gif", "png", ""]
   end

   protected
     def secure_token(length=9)
        var = :"@#{mounted_as}_secure_token"
        model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.hex(length/2))
     end

  end

谢谢

【问题讨论】:

    标签: amazon-s3 carrierwave fog


    【解决方案1】:

    这是carrierwave中的一个已知问题,已在master上修复但尚未发布。您的选择是:

    1. 使用carrierwave master 而不是官方gem 版本。

    2. 更新 sanitize_regexp 以排除 + 字符。

      CarrierWave::SanitizedFile.sanitize_regexp = /[^a-zA-Z0-9.-_]/

    新的上传将适用于其中任何一个,但您仍然需要手动修复旧的(通过 s3 挖掘以找到正确的文件名,然后更新您的数据库)。或者干脆删除它们。

    【讨论】:

    • 非常感谢您的洞察力。它真的帮助了我
    【解决方案2】:

    很可能您错误地编码了 URL,因为“+”号必须首先进行 URL 编码。

    我建议您运行某种流量分析工具(例如Wireshark),看看您将哪种流量发送到 Amazon S3 服务器。

    希望对你有帮助!

    【讨论】:

    • 感谢它实际上没有正确编码字符的 gem carrierwave
    猜你喜欢
    • 2017-02-12
    • 2012-06-24
    • 2019-04-20
    • 2019-02-03
    • 2018-01-10
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多