【发布时间】:2019-03-17 13:34:33
【问题描述】:
在我的应用程序中,我将视频从 Amazon S3 云下载到沙盒。为了确保下载的文件没有损坏,我将对象的 eTag(由亚马逊提供)与驻留在本地文件系统中的下载对象的 MD5 哈希值进行比较。对于小视频(
对于更大的文件,这两个参数不再匹配 - 据我所知,亚马逊为大于 5MB 的文件生成不同的 eTag - eTag 也有一个尾随连字符,后面有一个数字(可能是块的数量?):
8c18c4ed68bc9db377cb2d3225c0ee31-4
在互联网上,我找不到解决方案或代码 sn-p 计算更大文件的正确 MD5 哈希。
计算 MD5 哈希,我都试过了
localData.md5().toHexString() // CryptoSwift
两者
var md5: String? {
let hash = localData.withUnsafeBytes { (bytes: UnsafePointer<Data>) -> [UInt8] in
var hash: [UInt8] = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH))
CC_MD5(bytes, CC_LONG(localData.count), &hash)
return hash
}
return hash.map { String(format: "%02x", $0) }.joined()
}
有人知道如何解决这个问题吗? 也许我应该专注于另一种方法 - 例如检查下载的视频是否可以打开?
【问题讨论】:
-
我没有使用 Amazon S3 的经验,但是根据docs.aws.amazon.com/AmazonS3/latest/API/… 的说法,eTag 可能是 MD5 哈希值。
-
嗨,马丁,谢谢!我知道这份文件——我确实通过网络界面上传了所有文件——因此我想知道为什么亚马逊生成的电子标签不同。
-
引用的重复问题的标题是指大于 5GB 的文件,但实际上是指使用分段上传 API 上传的任何文件——这就是触发修改后的 etag 行为的原因。这可用于较小的文件,因为它允许开发人员自行决定上传并行性。对于超过 5 GB 的文件,Multipart 是强制性的,但对于小于 5 MB 的任何大小的文件都是可选的。 (从技术上讲,5MB 以下的文件甚至可以使用 multipart 上传,但部分的数量不能超过 1,因为除了最后一个部分之外的每个部分都必须 >= 5MB)。
-
有趣的是,许多自动选择上传算法的库(和控制台)似乎会为最小大小在 20 到 100 MB 范围内的文件切换到多部分模式,并将其用于所有更大的文件。
标签: swift amazon-web-services amazon-s3 md5 etag