我正在将我的应用程序从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
我的模型包含:
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
尝试上传文件时,出现错误:
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")
你有什么想法可以来这个问题吗? THX
答案 0 :(得分:13)
我有同样的问题。事实证明我使用了正确的访问密钥ID,但我的密钥被错误地复制了。
仔细检查我的密钥并更正它,为我修好了。
答案 1 :(得分:1)
好像你无法以正确的方式访问你的aws。您必须指定主机名,尤其是在非美国地区使用存储桶时。尝试使用
:s3_host_name => 's3-eu-west-1.amazonaws.com'
在您的has_attached_file
选项中。
如果您已将S3配置为使用https,请同时添加
:s3_protocol => 'https'
如果没有,请忽略它。
如果您的存储桶是私有存储桶,请添加
:s3_permissions => :private
您也不需要在options参数中明确配置存储桶,因为您已经在aws.yml中声明了它并通过:s3_credentials => Rails.root.join("config/aws.yml")
进行设置。
希望这有帮助。
答案 2 :(得分:1)
我的错误是使用 root 访问密钥而不是用户访问密钥。 AWS最近更改了它,因此您必须为自己创建一个单独的AIM用户,然后使用该用户的访问密钥(而不是root)