ruby-on-rails - 当我尝试使用预签名的 url 上传时,AWS Ruby SDK 给我一个 "The Content-MD5 you specified was invalid."错误

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

我在使用 AWS Ruby SDK 创建到 S3 的预签名上传链接时遇到问题,同时指定了 md5 哈希。

md5 -q my_file.jpg
4ef248082efb309d50f1cbbbd3d7cf4a

从 Rails 控制台:

AWS::S3.new.buckets[bucket].objects[key].url_for(:put, signature_version: :v4, content_md5: '4ef248082efb309d50f1cbbbd3d7cf4a').to_s
=> "https://s3.amazonaws.com/<rest_of_url_here>&X-Amz-SignedHeaders=Host%3BContent-MD5" 

从命令行:

curl -v -H "content-md5:4ef248082efb309d50f1cbbbd3d7cf4a" -T my_file.jpg "https://s3.amazonaws.com/<rest_of_url_here>&X-Amz-SignedHeaders=Host%3BContent-MD5"

<Error><Code>InvalidDigest</Code><Message>The Content-MD5 you specified was invalid.</Message>    <RequestId>blah</RequestId><Content-MD5>4ef248082efb309d50f1cbbbd3d7cf4a</Content-MD5><HostId>blah</HostId></Error>

我可以在不使用 content-md5 的情况下生成上传链接并上传。上传完成后,我验证了 S3 对象确实与我的本地文件具有相同的 MD5 哈希值。

最佳答案

显然您需要 MD5 base64 编码。请注意,它不是 MD5 十六进制字符串,而是需要编码的实际 MD5。我应该一直使用以下值:

openssl dgst -md5 -binary my_file.jpg | openssl enc -base64
TvJICC77MJ1Q8cu709fPSg==

关于ruby-on-rails - 当我尝试使用预签名的 url 上传时,AWS Ruby SDK 给我一个 "The Content-MD5 you specified was invalid."错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23417194/

相关文章:

ruby-on-rails - jruby on rails with warbler 和 tomcat 以及 windows

ruby-on-rails - rails : how to escape curly braces in variable

css - Guard 和 Compass watch 的区别

linux - 使用Cloud9 iDE与AWS交互是否是强制性的?

ruby-on-rails - 如何要求 Rubocop 检查特定方法/关键字的使用情况?

ruby-on-rails - Rails 错误地将被调用的命名空间嵌套到调用者命名空间中

Ruby MiniTest UnitTest Stubbing 类方法仅用于一次测试

ruby - compass 仅在部分运行

amazon-web-services - 定期归档AWS RDS中特定表的数据

Node.js 未按预期输出