下载之前获取放置在远程服务器上的图像的大小

时间:2018-07-13 09:42:35

标签: swift xcode image macos http-headers

我正在尝试获取放置在远程服务器中的图像的Ko大小,并检查是否需要下载该图像。 我尝试了很多在此论坛中找到的示例,但对于Xcode 8和Swift 4而言,它们对我没有任何帮助。 首先,我尝试获得像这样的标题:

func getHeader() {
    for (index, item) in imgUrlArray.enumerated() {
        let session = URLSession.shared
        session.dataTask(with: item) {
            (data, response, error)->Void in

            if let responseData = data {
                do {
                    let json =  try

                    JSONSerialization.jsonObject(with: responseData,
                        options: JSONSerialization.ReadingOptions.allowFragments)
                    print(json)
                } catch {
                    print("Could not serialize")
                }
            }
        }.resume()
    }
}

imgUrlArray是一个带有远程URL的数组,例如:http://www.test.com/image.jpg

在这种情况下,数据为零。我的错误在哪里?

2 个答案:

答案 0 :(得分:1)

经过几天的搜索,我找到了该解决方案:

    func getHeaderInformations (myUrl: URL, completion: @escaping (_ content: String?) -> ()) {

    var request = URLRequest(url: myUrl)
    request.httpMethod = "HEAD"
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
    guard error == nil, let reponse = response as? HTTPURLResponse, let contentType = reponse.allHeaderFields["Content-Type"],let contentLength = reponse.allHeaderFields["Content-Length"]

        else{
            completion(nil)
            return
    }
        let content = String(describing: contentType) + "/" + String(describing: contentLength)

            completion(content)
    }
    task.resume()
}

用法是这样的:

getHeaderInformations(for: url, completion: { content in

print(content ?? 0)

})

我希望这个答案可以对某人有所帮助。

答案 1 :(得分:0)

您应该使用发布的HEAD请求的代码示例,但不要使用两个函数和两个Web请求,而要创建一个名为getHeaders的函数,该函数返回request.allHeaderFields。然后,您可以创建一个调用getHeaders的方法,如果Content-Length和Content-Type是您所期望的,则执行GET请求以实际下载数据。

对于用户和服务器来说,这种方法将更加有效,因为它们只会执行1个HEAD请求,而不是2个。