【发布时间】:2016-12-17 10:21:56
【问题描述】:
我正在使用以下代码检查 S3 上是否存在文件。不幸的是,我永远不会出错。似乎 AWS 开发工具包应该返回一个错误,但它没有返回,因为主体是空的并且无法在 S3 错误中反序列化。
我该如何解决这个问题?一个解决方案是在响应中检查自己的 404,但我找不到使用 task 的方法。
s3.headObject(headRequest).continue({ task in
task.
if let taskError = task.error {
if let error = task.error as NSError? {
if error.domain == AWSS3ErrorDomain && AWSS3ErrorType(rawValue: error.code) == AWSS3ErrorType.noSuchKey {
return successBlock(false)
}
}
errorBlock(taskError)
return nil
}
return successBlock(true)
});
(如果错误是 403 也会出现同样的问题)
【问题讨论】:
-
有
task.result吗?它提供了什么有趣的东西吗? -
不,task.result 为 nil(b/c 正文为空)
-
请问您为什么要检查文件是否存在?对于许多操作,这是不必要的,并且可以将检查视为 noop(无操作)。大多数请求会在执行时指示文件是否存在,但 PUT 除外。
-
@JoshuaBriefman 我想获取文件的元数据以检查 MD5 标头,并避免重新上传。说我只使用 HEAD 请求来检查文件是否存在是不够准确的。
-
对象可能有也可能没有 MD5,如果对象是使用 Multipart 上传的,那么除非您知道用于上传它的部分大小,否则您将无法比较和确认 MD5哈希。这是因为 multipart 本身不存储 MD5 哈希。对象必须至少为 5MB 并且是 1 个或多个部分才能使用多部分。在某些情况下,SDK 可能会根据您上传的 API 为您选择多部分。
标签: ios objective-c swift amazon-web-services amazon-s3