You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Unix Shell中计算用于IBM COS API的Content-MD5请求头

解决IBM Cloud Object Storage批量删除时Content-MD5无效的问题

你遇到的问题很常见——用echo计算MD5时,默认会在输出末尾加一个换行符,导致你计算的哈希值和实际发送给API的请求体内容不匹配,所以才会返回The Content-MD5 you specified was an invalid错误。另外如果不小心用了中文引号(比如“而不是英文的"),也会导致内容偏差。

下面给你分系统提供正确的计算方式,以及完整的curl调用示例:

先明确批量删除的请求体格式

IBM COS的批量删除请求需要XML格式的请求体,比如:

<?xml version="1.0" encoding="UTF-8"?>
<Delete>
  <Objects>
    <Object>
      <Key>docs/report.pdf</Key>
    </Object>
    <Object>
      <Key>images/photo.jpg</Key>
    </Object>
  </Objects>
</Delete>

你可以把这段内容保存到文件(比如delete_objects.xml),这样计算MD5和发送请求时更不容易出错。

正确计算Content-MD5的命令

macOS系统

  • 如果用文件计算:
# 计算文件的MD5哈希,再转base64
MD5_HASH=$(md5 -q delete_objects.xml | base64)
  • 如果直接用字符串计算(确保字符串和请求体完全一致,无多余换行):
MD5_HASH=$(printf '<?xml version="1.0" encoding="UTF-8"?><Delete><Objects><Object><Key>docs/report.pdf</Key></Object><Object><Key>images/photo.jpg</Key></Object></Objects></Delete>' | md5 -q | base64)

Linux系统

Linux下用md5sum代替md5,需要提取哈希值部分:

  • 文件版本:
MD5_HASH=$(md5sum delete_objects.xml | awk '{print $1}' | base64)
  • 字符串版本:
MD5_HASH=$(printf '<?xml version="1.0" encoding="UTF-8"?><Delete><Objects><Object><Key>docs/report.pdf</Key></Object><Object><Key>images/photo.jpg</Key></Object></Objects></Delete>' | md5sum | awk '{print $1}' | base64)

完整的curl调用示例

用文件发送请求时,一定要用--data-binary参数,它会原样读取文件内容,避免-d参数对内容的自动处理:

curl -X POST \
  -H "Content-Type: text/plain;charset=utf-8" \
  -H "Content-MD5: $MD5_HASH" \
  -H "Authorization: $AuthToken" \
  --data-binary @delete_objects.xml \
  "https://<cos-endpoint-name>/<bucket-name>/?delete"

额外注意事项

  • 确保XML里的<Key>值完全匹配对象的实际路径(包括大小写,IBM COS是区分大小写的)
  • 不要在XML里添加多余的空格或换行,除非是XML语法允许的,否则会导致MD5计算不匹配
  • 如果是通过脚本生成请求体,一定要确保生成的内容没有额外的换行符或空白字符

内容的提问来源于stack exchange,提问作者Vamshi Krishna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:28:15