阿里云 OSS 分片上传如何进行文件校验?

在使用阿里云 OpenAPI进行分片上传完成后,如何对文件进行校验?
是不是可以使用 CompleteMultipartUpload 接口响应的 ETag 值进行 MD5 比对?但是在 文档 中对 ETag 的描述又是:

通过CompleteMultipartUpload请求创建的Object,ETag值是基于一定计算规则生成的唯一值,但不是其内容的MD5值。
说明 ETag值可以用于检查Object内容是否发生变化。不建议使用ETag作为Object内容的MD5来校验数据完整性。

所以 ETag 到底是不是文件 MD5 值,到底可不可以用来校验文件完整性?如果不行,那如何实现?

展开
收起
annlix 2023-09-21 09:53:33 426 发布于云南 分享
分享
版权
举报
阿里云 AI 助理回答

在使用阿里云 OpenAPI 进行分片上传完成后,文件的校验是一个重要的环节。以下是关于如何进行文件校验以及 ETag 是否可以用于 MD5 校验的详细解答:


1. ETag 的定义与用途

ETag 是对象存储(OSS)中每个 Object 生成时创建的一个标识值,用于唯一标识该 Object 的内容。
- 通过 PutObject 接口上传的文件:ETag 值是文件内容的 MD5 值。 - 通过分片上传(Multipart Upload)生成的文件:ETag 值是基于一定计算规则生成的唯一值,但并不是文件内容的 MD5 值。

因此,ETag 值不能直接作为文件内容的 MD5 值来校验数据完整性
虽然 ETag 可以用来检查 Object 内容是否发生变化,但它并不适合作为文件完整性的校验依据。


2. 分片上传完成后如何校验文件完整性

由于 ETag 不适合直接用于校验分片上传文件的完整性,您可以采用以下方法实现文件校验:

2.1 使用 Content-MD5 校验单个分片

在分片上传过程中,您可以在每个分片上传时携带 Content-MD5 参数。OSS 服务器会根据该参数对分片内容进行 MD5 校验,只有当 OSS 计算的 MD5 值与您提供的 Content-MD5 值一致时,分片才会上传成功。
这种方式可以确保每个分片的内容在传输过程中没有被篡改或损坏。

示例代码(Java):

// 计算分片的 MD5 值并设置到请求头中
String contentMD5 = Base64.encodeBase64String(DigestUtils.md5(new FileInputStream(partFile)));
uploadPartRequest.setContentMD5(contentMD5);

2.2 在客户端计算整个文件的 MD5 值

如果您需要校验整个文件的完整性,可以在本地计算文件的 MD5 值,并在文件上传完成后重新下载文件进行比对。具体步骤如下: 1. 上传前:在本地计算整个文件的 MD5 值。 2. 上传后:通过 GetObject 接口下载文件,并重新计算其 MD5 值。 3. 比对:将上传前后的 MD5 值进行比对,确保文件内容一致。

2.3 使用 CRC64 校验

OSS 提供了基于 CRC64 的校验机制,您可以通过 GetObjectMetaHeadObject 接口获取文件的 Meta 信息中的 crc64 值,并将其与本地计算的 CRC64 值进行比对。
CRC64 是一种高效的校验算法,适用于大文件的完整性校验。

示例代码(Python):

# 获取文件的 Meta 信息
meta = bucket.head_object(key)
crc64_value = meta.headers.get('x-oss-hash-crc64ecma')

3. CompleteMultipartUpload 接口返回的 ETag

调用 CompleteMultipartUpload 接口完成分片上传后,响应中会包含一个 ETag 值。这个 ETag 值是基于分片上传过程中所有分片的 ETag 和分片号计算得出的唯一值。
- 特点
- 它不是文件内容的 MD5 值。 - 它可以用于检查文件内容是否发生变化,但不适合直接用于校验文件完整性。


4. 总结与建议

  • ETag 不是文件的 MD5 值,因此不能直接用于校验文件完整性。
  • 如果需要校验分片上传文件的完整性,推荐以下方法:
    1. 在分片上传时使用 Content-MD5 参数校验每个分片。
    2. 在客户端计算整个文件的 MD5 值,并在上传完成后重新下载文件进行比对。
    3. 使用 OSS 提供的 CRC64 校验机制,通过 GetObjectMetaHeadObject 接口获取文件的 CRC64 值进行比对。

通过以上方法,您可以有效确保分片上传文件的完整性和一致性。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答

云服务器(Elastic Compute Service,简称 ECS)是一种简单高效、处理能力可弹性伸缩的计算服务,可快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本。

还有其他疑问?
咨询AI助理
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等