开发者社区 问答 正文

OSS对象存储服务,C-SDK, MD5-content究竟如何输入?

小弟想上传一个文件,但服务器老是报错:
put object from file failed, code:400, error_code:InvalidDigest, error_msg:The Content-MD5 you specified was invalid., request_id:58B38CD41A1B347B44DB2081


我的逻辑是先计算文件的md5,然后编码成base64,以字符串的形式传递给服务器。举一个例子:
std::string md5 = "893883f97de9ad036f83cf91996d4218";
***
通过md5计算得到相应的base64编码
***
std::string md5_base64 = "ODkzODgzZjk3ZGU5YWQwMzZmODNjZjkxOTk2ZDQyMTg=";
apr_table_set(headers, OSS_CONTENT_MD5, md5_base64.c_str());


有没有大神帮忙看看怎么解决啊?

展开
收起
xiaooo 2017-02-27 10:47:48 7614 分享 版权
2 条回答
写回答
取消 提交回答
  • https://help.aliyun.com/document_detail/31951.html?spm=5176.product31815.6.831.wiMDrE

    Content-MD5的计算方法

    Content-MD5的计算
    以消息内容为"123456789"来说,计算这个字符串的Content-MD5
    正确的计算方式:
    标准中定义的算法简单点说就是:
    1. 先计算MD5加密的二进制数组(128位)。
    2. 再对这个二进制进行base64编码(而不是对32位字符串编码)。
    以Python为例子:
    正确计算的代码为:
    >>> import base64,hashlib
    >>> hash = hashlib.md5()
    >>> hash.update("0123456789")
    >>> base64.b64encode(hash.digest())
    'eB5eJF1ptWaXm4bijSPyxw=='
    需要注意
    正确的是:hash.digest(),计算出进制数组(128位)
    >>> hash.digest()
    'x\x1e^$]i\xb5f\x97\x9b\x86\xe2\x8d#\xf2\xc7'
    常见错误是直接对计算出的32位字符串编码进行base64编码。
    例如,错误的是:hash.hexdigest(),计算得到可见的32位字符串编码
    >>> hash.hexdigest()
    '781e5e245d69b566979b86e28d23f2c7'
    错误的MD5值进行base64编码后的结果:
    >>> base64.b64encode(hash.hexdigest())
    'NzgxZTVlMjQ1ZDY5YjU2Njk3OWI4NmUyOGQyM2YyYzc='
    2017-03-25 15:36:57
    赞同 展开评论
  • 旺旺:nectar2。
    楼主您好,

    我为您尝试将帖子移到 OSS 的版块,希望有人更快回复您。
    2017-02-27 13:38:01
    赞同 展开评论