S3服务器上传问题

客户S3环境有升级变迁,然后之前上传文件服务器出现异常问题

生产环境S3服务器文件上传异常原因及解决方案:

上传文件-异常信息如下

com.amazonaws.SdkClientException: Unable to verify integrity of data upload. Client calculated content hash (contentMD5: EWsFdgDklAxX7zec1r+G6A== in base 64) didn't match hash (etag: 00000001bb63458f65af7d7b01ec0120 in hex) calculated by Amazon S3. You may need to delete the data stored in Amazon S3. ( metadata.contentMD5: null , md5DigestStream: com.amazonaws.services.s3.internal.MD5DigestCalculatingInputStream@113213f1, bucketName: e-invoice, key: 2024/123/test-7.png)

问题原因:

上传文件时有个ContentMD5属性,需要计算出文件的Base64编码的MD5哈希值,并通过metadata.setContentMD5(contentMD5)方法设置进去。上传后,AWS.S3服务器接收到文件,会对上传的内容进行MD5哈希运算,并将结果与上传时设置的contentMD5值进行比较比较。

如果没提供 ContentMD5 ,则依赖于S3服务的ETag作为完整性检查。ETag可能不总是等同于MD5哈希值,特别是在多部分上传(Amazon S3提供的一种文件上传机制,它允许将大型文件分成较小的部分逐个上传,而不是一次性上传整个文件)。因此需要通过提供MD5值,消除了依赖ETag的不确定性。

我们原先的代码,没有提供MD5值,原先客户部署在上海的老的S3服务器的上传策略没有一致性校验。最近客户对生产环境的S3文件服务器做了迁移与升级,现在是版本较新的S3服务器,猜测是新得机器上传策略做了调整,有md5一致性校验策略。

解决方案:

方案一:上传时关闭md5校验 System.setProperty(SkipMd5CheckStrategy.DISABLE_PUT_OBJECT_MD5_VALIDATION_PROPERTY, "true"); 不建议,传输过程中有可能文件发生变化,关掉这个校验会存在安全问题

方案二:上传前,计算文件的md5值,并设置到ContentMD5属性中,确保了数据在传输过程中没有损坏或发生变化

最后改成了 方案二 ,经测试也兼容了老的S3文件服务器,故选择此方案

posted @ 2024-02-21 16:55  God-slayer  阅读(91)  评论(0编辑  收藏  举报