【问题标题】:Image download issue图片下载问题
【发布时间】:2018-03-27 05:36:22
【问题描述】:

我正在尝试从以下 URL 下载图像。收到状态码 200 文件后下载成功,但如果状态码是 301,那么它会在 Header 中给我一个新的 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中工作,我不知道为什么。

状态 = 下载成功,但图像格式不受支持。

【问题讨论】:

  • 亲爱的 ilesh,分享你尝试过的代码。
  • @ilesh 在网络上它正在将我重定向到 lance camper 的网站。请先验证网址。
  • 图片“TT_1685_Int_hero.jpg”在“lancecamper.com/images/trailers”不可用。
  • @JarvisTheAvenger,是的,我知道相同的 URL 适用于 Android。所以请给我解决方案或想法。如何在 ios 上获取图像?
  • 谢谢大家,您能再检查一下上面的问题吗?如果您有任何疑问,请告诉我?

标签: ios objective-c nsurlconnection nsurlrequest nsurlsessiondownloadtask


【解决方案1】:

@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
}

【讨论】:

  • 不工作,我发现来自 URL 的数据是 45127 字节,但图像是 nil。
  • @ilesh 图片不受支持。
  • 你可以使用缓存来做同样的事情。
  • 请先验证您的网址,问题出在网址本身。
【解决方案2】:

问题在于链接本身https://www.lancecamper.com/images/trailers/TT_1685_Int_hero.jpg。而不是返回一个重定向到https://www.lancecamper.com的图像。

【讨论】:

  • 如何停止重定向。
  • 问题不在于重定向。服务器上该位置没有图像文件。服务器配置为重定向到主页,而不是返回 404。
猜你喜欢
  • 2023-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多