Обновлено:
После обсуждения в разделе комментариев, код обновляется, чтобы работать более корректно.
Вы должны проверить mimeType
объекта URLResponse
вместо того, чтобы проверять, можно ли представить изображение как UIImageJPEGRepresentation
/ UIImagePNGRepresentation
или нет.Потому что это не гарантирует, что ресурс на самом деле является jpg / jpeg или png .
Так что mimeType
должен быть наиболее надежным параметром, который долженрассматривается здесь.
enum MimeType: String {
case jpeg = "image/jpeg"
case png = "image/png"
}
func remoteResource(at url: URL, isOneOf types: [MimeType], completion: @escaping ((Bool) -> Void)) {
var request = URLRequest(url: url)
request.httpMethod = "HEAD"
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
guard let response = response as? HTTPURLResponse, response.statusCode == 200, let mimeType = response.mimeType else {
completion(false)
return
}
if types.map({ $0.rawValue }).contains(mimeType) {
completion(true)
} else {
completion(false)
}
}
task.resume()
}
Проверьте это:
let jpegImageURL = URL(string: "https://vignette.wikia.nocookie.net/wingsoffire/images/5/54/Panda.jpeg/revision/latest?cb=20170205005103")!
remoteResource(at: jpegImageURL, isOneOf: [.jpeg, .png]) { (result) in
print(result) // true
}
let pngImageURL = URL(string: "https://upload.wikimedia.org/wikipedia/commons/6/69/Giant_panda_drawing.png")!
remoteResource(at: pngImageURL, isOneOf: [.jpeg, .png]) { (result) in
print(result) //true
}
let gifImageURL = URL(string: "https://media1.tenor.com/images/f88f6514b1a800bae53a8e95b7b99172/tenor.gif?itemid=4616586")!
remoteResource(at: gifImageURL, isOneOf: [.jpeg, .png]) { (result) in
print(result) //false
}
Предыдущий ответ:
Вы можете проверить, если удаленные данныеможет быть представлен как UIImageJPEGRepresentation
или UIImagePNGRepresentation
.Если да, вы можете сказать, что удаленным файлом является JPEG или PNG .
Попробуйте:
func remoteResource(at url: URL, isImage: @escaping ((Bool) -> Void)) {
let request = URLRequest(url: url)
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
if let data = data, let image = UIImage(data: data) {
if let _ = UIImageJPEGRepresentation(image, 1.0) {
isImage(true)
} else if let _ = UIImagePNGRepresentation(image) {
isImage(true)
} else {
isImage(false)
}
} else {
isImage(false)
}
}
task.resume()
}
Использование:
let imageURL = URL(string: "http://domaind.com/index.php?action=GET_PHOTO&name=102537.jpg&resolution=FHD&lang=PL®ion=1")!
remoteResource(at: imageURL) { (isImage) in
print(isImage) // prints true for your given link
}