Как проверить, существует ли файл jpg / pdf под выбранным URL? - PullRequest
0 голосов
/ 23 мая 2018

Если я хочу проверить, существует ли файл на моем iPhone, просто используйте следующий код:

  let filePath = fileName.path
         let fileManager = FileManager.default
         if fileManager.fileExists (atPath: filePath) {

}

Как я могу проверить, есть ли файл pdf / jpg / png по URL:www.myname.com/files/file1.jpg или www.myname.com/files/file2.pdf и т. д .?

Могу ли я попросить привести пример такой функции, но не для файлов на веб-серверах Интернета?

ОБНОВЛЕНИЕ

func remoteFileExistsAt(url: URL, completion: @escaping (Bool) -> Void) {
    let checkSession = URLSession.shared
    var request = URLRequest(url: url)
    request.httpMethod = "HEAD"
    request.timeoutInterval = 1.0 // Adjust to your needs

    let task = checkSession.dataTask(with: request) { (data, response, error) -> Void in
        if let httpResp = response as? HTTPURLResponse {
            completion(httpResp.statusCode == 200)
        }
    }
    task.resume()
}

Можно ли в этой функции проверить, является ли файл типом JPG или PNG?Если это так - тогда мы также возвращаем true, а если нет, false?

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Речь идет о получении данных с URL.Если данные равны нулю, файл не существует.

Получение данных с URL в Swift

0 голосов
/ 23 мая 2018

Обновлено:

После обсуждения в разделе комментариев, код обновляется, чтобы работать более корректно.

Вы должны проверить 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&region=1")!
remoteResource(at: imageURL) { (isImage) in
    print(isImage) // prints true for your given link
}
0 голосов
/ 23 мая 2018

Если вы хотите знать, что файл существует на сервере, то он требует отправки HTTP-запроса и получения ответа.

Пожалуйста, попробуйте следующий код,

func remoteFileExistsAt(url: URL, completion: @escaping (Bool) -> Void) {
    let checkSession = URLSession.shared
    var request = URLRequest(url: url)
    request.httpMethod = "HEAD"
    request.timeoutInterval = 1.0 // Adjust to your needs

    let task = checkSession.dataTask(with: request) { (data, response, error) -> Void in
        if let httpResp = response as? HTTPURLResponse {
            completion(httpResp.statusCode == 200)
        } else {
            completion(false) 
        }
    }
    task.resume()
}

ОБНОВЛЕНИЕ

remoteFileExistsAt(url: URL(string: "http://domaind.com/index.php?action=GET_PHOTO&name=102537.jpg&resolution=FHD&lang=PL&region=1")!) { (success) in
    print(success)
}
...