Проблема с загрузкой изображения

Я пытаюсь загрузить изображения из приведенных ниже URL-адресов. После получения кода состояния 200 файл успешно загружается, но если код состояния равен 301, то он даст мне новый URL-адрес в заголовке, но загрузка с этого URL-адреса завершится неудачно.

Шаг 1: https://www.lancecamper.com/images/trailers/lance-rv-trailers-1475s-din-2018.jpg

Ответ:

{ URL: https://www.lancecamper.com/images/trailers/lance-rv-trailers-1475s-din-2018.jpg }
{ status code: 200, headers {
    "Accept-Ranges" = bytes;
    "Cache-Control" = "public,max-age=7776000";
    "Content-Length" = 224200;
    "Content-Type" = "image/jpeg";
    Date = "Tue, 27 Mar 2018 04:52:30 GMT";
    Etag = "\"5bea410a65dd31:0\"";
    "Last-Modified" = "Wed, 15 Nov 2017 00:09:27 GMT";
    Server = "Microsoft-IIS/8.5";
    "X-Powered-By" = "ASP.NET";
}}

Статус = успешно загружено.

Шаг 2: http://www.lancecamper.com/images/trailers/TT_1685_Int_hero.jpg Ответ:

{ URL: http://www.lancecamper.com/images/trailers/TT_1685_Int_hero.jpg }
{ status code: 301, headers {
    "Content-Length" = 187;
    "Content-Type" = "text/html; charset=UTF-8";
    Date = "Tue, 27 Mar 2018 05:18:45 GMT";
    Location = "https://www.lancecamper.com/images/trailers/TT_1685_Int_hero.jpg";
    Server = "Microsoft-IIS/8.5";
    "X-Powered-By" = "ASP.NET";
}}

Когда я получаю статус 301, я также получаю новый URL-адрес в заголовке «Местоположение», и я не могу загрузить файл, используя этот URL-адрес. Он показывает статус успеха, но говорит мне, что формат не поддерживается. Это работало в Android, и я не знаю, почему.

Статус = Скачано успешно, но формат изображения не поддерживается.


person Ilesh P    schedule 27.03.2018    source источник
comment
Уважаемый ilesh, поделитесь проверенным кодом.   -  person Imad Ali    schedule 27.03.2018
comment
@ilesh в сети перенаправляет меня на сайт lance camper. Сначала подтвердите URL.   -  person Jarvis The Avenger    schedule 27.03.2018
comment
изображение TT_1685_Int_hero.jpg недоступно на lancecamper.com/images/trailers.   -  person Vandit Mehta    schedule 27.03.2018
comment
@JarvisTheAvenger, да, я знаю, что тот же URL работает для Android. Поэтому, пожалуйста, дайте мне решение или идею. как я могу получить изображение на ios?   -  person Ilesh P    schedule 27.03.2018
comment
Спасибо всем, не могли бы вы еще раз проверить вышеуказанный вопрос? и дайте мне знать, если у вас есть какие-либо вопросы?   -  person Ilesh P    schedule 27.03.2018
comment
Загрузите демоверсию по этому ** URL-адресу: - cocoacontrols.com/controls/srdownloadmanager ** и замените этот 2 URL 1) lancecamper.com/images/campers/TC_0855s_Int_hero.jpg 2) lancecamper.com/images/trailers/ оба сохраняются в каталоге документов, но один не открывается.   -  person Ilesh P    schedule 27.03.2018
comment
@ilesh, не могли бы вы поделиться кодом, что вы сделали для загрузки изображений?   -  person Jarvis The Avenger    schedule 27.03.2018
comment
@ты загружаешь несколько изображений с сервера??   -  person Jarvis The Avenger    schedule 27.03.2018
comment
Да, но большинство из них загружаются, а остальные, базовый URL которых изменен, не загружаются.   -  person Ilesh P    schedule 27.03.2018
comment
Вместо использования библиотеки для этого требования вы можете использовать метод расширения UIImageView ниже.   -  person Jarvis The Avenger    schedule 27.03.2018
comment
Мы используем базу данных для одного и того же проекта, поэтому, если однажды загрузить изображение, оно не будет загружено снова. Мы получаем от местных в следующий раз.   -  person Ilesh P    schedule 27.03.2018


Ответы (2)


@ilesh Попробуйте использовать этот метод расширения UIImageView:

// Download image with given URL and Placeholder image is used when downloading failed.
public func imageFromURL(string: String?, placeholderImageName: String?, completion: ((Bool) -> Void)?) {
    if let placeholderImageName = placeholderImageName {
        self.image = UIImage(named: placeholderImageName)
    }
    else {
        self.image = nil
    }

    //Set unique identifier to check re-usability condition
    let strUniqueIdentifier = "\(abs(string?.hashValue ?? (UUID().uuidString.hashValue)))"
    if self.accessibilityLabel != strUniqueIdentifier {
        if let request = self.accessibilityElements?.first as? DataRequest {
            //A download task is already in progress so cancel it
            request.cancel()
            self.accessibilityElements?.removeAll()
        }
    }
    self.accessibilityLabel = strUniqueIdentifier

    guard let url = URL(string: string?.replacingOccurrences(of: " ", with: "%20") ?? "")
        else {
            print("\(#function)No url specified")

            if let completion = completion {
                completion(false)
            }
            return
    }

    let activityView = addActivityIndicator(toView: self)
    var mutableRequest = URLRequest(url: url)
    mutableRequest.cachePolicy = NSURLRequest.CachePolicy.returnCacheDataElseLoad
    let request =
        Alamofire
            .request(mutableRequest)
            .response { (response) in
                DispatchQueue.main.async(execute: {
                    activityView.removeFromSuperview()
                })

                var success = false

                if response.response?.statusCode == 200 {

                    let strUniqueIdentifier_Closure = self.accessibilityLabel
                    if strUniqueIdentifier == strUniqueIdentifier_Closure {
                        success = true
                    }
                    else {
                        success = false
                        debugPrint("Unable to set image: uniqueIdentifier check failed")
                    }

                    if success, let data = response.data {
                        DispatchQueue.main.async(execute: {
                            self.image = UIImage(data: data)
                        })
                    }

                }

                if let completion = completion {
                    completion(success)
                }
    }
    self.accessibilityElements = [request]
}

private func addActivityIndicator(toView view: UIView) -> UIView {
    let sizeOfActivityContainer: CGFloat = 36.0

    let vwContainer = UIView(frame: CGRect(x: 0,
                                           y: 0,
                                           width: sizeOfActivityContainer,
                                           height: sizeOfActivityContainer))
    vwContainer.backgroundColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 0.3)
    vwContainer.tag = 100

    vwContainer.layer.cornerRadius = sizeOfActivityContainer/2
    vwContainer.layer.masksToBounds = true

    vwContainer.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(vwContainer)

    vwContainer.addConstraint(NSLayoutConstraint(item: vwContainer,
                                                 attribute: .height,
                                                 relatedBy: .equal,
                                                 toItem: nil,
                                                 attribute: .notAnAttribute,
                                                 multiplier: 1,
                                                 constant: sizeOfActivityContainer))
    vwContainer.addConstraint(NSLayoutConstraint(item: vwContainer,
                                                 attribute: .width,
                                                 relatedBy: .equal,
                                                 toItem: nil,
                                                 attribute: .notAnAttribute,
                                                 multiplier: 1,
                                                 constant: sizeOfActivityContainer))
    view.addConstraint(NSLayoutConstraint(item: vwContainer,
                                          attribute: .centerX,
                                          relatedBy: .equal,
                                          toItem: view,
                                          attribute: .centerX,
                                          multiplier: 1,
                                          constant: 0))
    view.addConstraint(NSLayoutConstraint(item: vwContainer,
                                          attribute: .centerY,
                                          relatedBy: .equal,
                                          toItem: view,
                                          attribute: .centerY,
                                          multiplier: 1,
                                          constant: 0))

    let activityIndicator = UIActivityIndicatorView.init(activityIndicatorStyle: .white)
    activityIndicator.startAnimating()

    activityIndicator.translatesAutoresizingMaskIntoConstraints = false
    vwContainer.addSubview(activityIndicator)

    vwContainer.addConstraint(NSLayoutConstraint(item: activityIndicator,
                                                 attribute: .centerX,
                                                 relatedBy: .equal,
                                                 toItem: vwContainer,
                                                 attribute: .centerX,
                                                 multiplier: 1,
                                                 constant: 0))
    vwContainer.addConstraint(NSLayoutConstraint(item: activityIndicator,
                                                 attribute: .centerY,
                                                 relatedBy: .equal,
                                                 toItem: vwContainer,
                                                 attribute: .centerY,
                                                 multiplier: 1,
                                                 constant: 0))
    return vwContainer
}
person Jarvis The Avenger    schedule 27.03.2018
comment
Не работает, я обнаружил, что данные из URL-адреса составляют 45127 байт, но изображение равно нулю. - person Ilesh P; 27.03.2018
comment
@ilesh Изображение не поддерживается. - person Jarvis The Avenger; 27.03.2018
comment
Вы можете использовать кеш, чтобы сделать то же самое. - person Jarvis The Avenger; 27.03.2018
comment
Сначала подтвердите свой URL. Проблема в самом URL. - person Jarvis The Avenger; 27.03.2018

Проблема связана с самой ссылкой https://www.lancecamper.com/images/trailers/TT_1685_Int_hero.jpg. Вместо этого возвращайте изображение, которое он перенаправляет на https://www.lancecamper.com.

person Dmytro Trofymenko    schedule 27.03.2018
comment
Как перестать перенаправлять. - person Ilesh P; 27.03.2018
comment
Проблема не в редиректе. В этом месте на сервере нет файла изображения. Сервер настроен на перенаправление на главную страницу, а не на возврат 404. - person Dmytro Trofymenko; 27.03.2018