错误:: SignatureDoesNotMatch,AWS-SDK gem for paper support for paperclip 3.0.1 and rails 3.2

Bac*_*het 12 amazon-s3 paperclip ruby-1.9.3 ruby-on-rails-3.2

我正在将我的应用程序从Rails 3.0.9迁移到3.2.3和ruby 1.9.3.我正在使用带有aws-s3 gem的paperclip(2.3.11)来存储我的照片.

现在我想使用最后一个版本的paperclip(3.0.1)然后我必须使用aws-sdk gem.

我将我的aws.yml文件设置为:

    development: &development
      bucket: bucket_name_for_dev
      access_key_id: *****
      secret_access_key: *******
    staging:
      <<: *development
      bucket: bucket_name_for_staging

    production:
      <<: *development
      bucket: bucket_name_for_prod
Run Code Online (Sandbox Code Playgroud)

我的模型包含:

    has_attached_file :picture, :styles => { :medium => "300x300>", :thumb => "50x50>" }, :default_url => 'picture_missing.png',
         :storage => :s3,
         :bucket => "bucket_name_for_dev",
         :s3_credentials => Rails.root.join("config/aws.yml"),
         :path => "/presentation_pictures/:id/:style/:filename",
         :url  => ":s3_eu_url"

    attr_accessible :picture
    attr_accessor :picture_url
Run Code Online (Sandbox Code Playgroud)

尝试上传文件时,我收到错误消息:

AWS::S3::Errors::SignatureDoesNotMatch The request signature we calculated does not match the signature you provided. Check your key and signing method.

我确认我的密钥可以访问并设置为正确的值.

这也是我从控制台得到的:

    [paperclip] Saving attachments.
    [paperclip] saving /presentation_pictures/43/original/Image_1.png
    [AWS S3 200 0.813272 0 retries] put_object(:acl=>:public_read,:bucket_name=>"*******_dev",:content_type=>"image/png",:data=>#<Paperclip::UploadedFileAdapter:0x2e144b4 @target=#<ActionDispatch::Http::UploadedFile:0x2dbb1fc @original_filename="Image 1.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"presentation_picture[picture]\"; filename=\"Image 1.png\"\r\nContent-Type: image/png\r\n", @tempfile=#<File:/var/folders/tb/tbmv4LE9EwGNPr1QqU2S0E+++TI/-Tmp-/RackMultipart20120407-33502-1gajfe9>>, @tempfile=#<File:/var/folders/tb/tbmv4LE9EwGNPr1QqU2S0E+++TI/-Tmp-/Image 1.png20120407-33502-an4dcy>>,:key=>"presentation_pictures/43/original/Image_1.png")
Run Code Online (Sandbox Code Playgroud)

你有什么想法可以来这个问题吗?谢谢

Dan*_*ore 14

我遇到过同样的问题.事实证明我使用了正确的访问密钥ID,但我的密钥被错误地复制了.

仔细检查我的密钥并纠正它为我修复它.

  • 是的... 2x-点击,复制和粘贴可以导致有趣的结果AWS使用将分解键作为单独的单词的字符. (2认同)

小智 1

似乎您无法以正确的方式访问您的 aws。您必须指定您的主机名,尤其是在非美国区域使用存储桶时。尝试使用

:s3_host_name => 's3-eu-west-1.amazonaws.com'
Run Code Online (Sandbox Code Playgroud)

在你的has_attached_file选择中。

如果您已将 S3 配置为使用 https,还需添加

:s3_protocol => 'https' 
Run Code Online (Sandbox Code Playgroud)

如果没有,请忽略它。

如果您的存储桶是私人存储桶,请添加

:s3_permissions => :private
Run Code Online (Sandbox Code Playgroud)

您也不需要在 options 参数中显式配置您的存储桶,因为您已经在 aws.yml 中声明它并通过 进行设置:s3_credentials => Rails.root.join("config/aws.yml")

希望这可以帮助。