【问题标题】:AWS S3 HEAD request not returning 404 when file doesn't not exist当文件不存在时,AWS S3 HEAD 请求不返回 404
【发布时间】: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


【解决方案1】:

这里的问题是您永远不会收到 Body,因为 HEAD 请求旨在不返回一个。

RFC7230 - Section 3.3

对 HEAD 请求方法的响应(第 4.3.2 节 [RFC7231])从不包含消息正文,因为相关的 响应头字段(例如,Transfer-Encoding、Content-Length、 等),如果存在,仅表明它们的值是什么,如果 请求方法是 GET([RFC7231] 的第 4.3.1 节)。

但是,您仍然可以获得 HTTP 状态代码,该代码应指示发生的任何错误的状态。

【讨论】:

  • 我没有收到正文很好,但 AWS 开发工具包应该处理这个问题并返回正确的错误。我认为 AWS 开发工具包尝试从正文中提取错误代码,但不能(您所说的 b/c),因此返回成功代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
  • 2020-08-06
  • 2019-03-30
  • 1970-01-01
相关资源
最近更新 更多