无法从特定网址下载图片

时间:2019-09-18 15:25:05

标签: swift

我在这里有图片网址: https://spi-ra.jp/wp-content/uploads/2019/09/あRP27988_1012.jpg

然后我将其编码为: https://spi-ra.jp/wp-content/uploads/2019/09/%E3%81%82RP27988_1012.jpg

我尝试了Kingfisher,SDWebImage和URLSession来下载它,但是都失败了。我不知道为什么 这是我的代码:

        URLSession.shared.dataTask(with: URL(string: "https://spi-ra.jp/wp-content/uploads/2019/09/%E3%81%82RP27988_1012.jpg")!) {[weak self] (data, response, error) in
        print(data) // 76606 bytes
        DispatchQueue.main.async {
            self?.imageView.image = UIImage(data: data!) // nil 
        }
    }.resume()

任何人都可以给我一些建议吗?谢谢

1 个答案:

答案 0 :(得分:1)

让我们进行一些调试

#!/bin/bash

find . -name '*.xyz' -exec shasum {} + |
# Reverse each line, sort by first field, reverse again
# Entries for files with the same basename will now be adjacent
rev | sort -t / -k1,1 | rev |
awk -F / '$NF!=p { p=$NF; delete a; c=""; }
    { split($0, x, /[ \t]+/);
        if(x[2] ~ /^\.\/1\//) { 
            if (a[x[1]]) print a[x[1]];
        c = x[1];
            next
        }
        if (c) {
            if (x[1] == c) print x[2];
            next;
        }
        a[x[1]] = x[2] (a[x[1]] ? ORS a[x[1]] : ""); }'

此打印

URLSession.shared.dataTask(with: URL(string: "https://spi-ra.jp/wp-content/uploads/2019/09/%E3%81%82RP27988_1012.jpg")!) { (data, response, error) in

    guard let response = response else {
        print("No response")
        return
    }
    print("Response:\n\(response)")

    guard let data = data else {
        print("No data")
        return
    }

    print("data.count: \(data.count)")

    //Is image valid/interpreted as such?
    let image = UIImage(data: data)
    print(image ?? "no image")

    //Get first 100 bytes because all of it isn't necessary
    let subData = Data(data.prefix(100))
    //Convert it into "hex string"
    let hexString = subData.reduce("", { $0 + String(format: "%02x", $1) })
    print("HexString: \(hexString)")

}.resume()

JPEG图像应以“ FFD8”开头,而不是“ 5249”。

调试附加组件:使用 Safari.app 打开链接不会显示图片,但是使用 Chrome.app 打开它即可。

查看the documentation of WebP之后进行了一些搜索,因为我记得WebP是一种“ Google格式”(解释了为什么它在Chrome上有效,但在Safari上无效)。

Response:
<NSHTTPURLResponse: 0x60000269a460> { URL: https://spi-ra.jp/wp-content/uploads/2019/09/%E3%81%82RP27988_1012.jpg } { Status Code: 200, Headers {
    "Accept-Ranges" =     (
        bytes
    );
    "Content-Length" =     (
        76606
    );
    "Content-Type" =     (
        "image/jpeg"
    );
    ...
} }
data.count: 76606
no image
HexString: 52494646362b010057454250565038202a2b0100b002049d012a1c031c023e6d3093472422a1a529571b68a00d8945bd76d35a3d9576f28c75a36dd6cdfe8bc8d375a3dfe23abbba7231d4dedcd9b5f7da446bf2ef8ff1d0ff3771ff33ff9bcd77ddfbe6

礼物:

let riffData = "RIFF".data(using: .ascii)
let webpData = "WEBP".data(using: .ascii)
print("riffData: \(riffData?.reduce("", { $0 + String(format: "%02x", $1) }))")
print("webpData: \(webpData?.reduce("", { $0 + String(format: "%02x", $1) }))")

我们看到了相同的开始,稍后再找到webpData(检查文档/标题长度)。

因此,这是一个WebP图像,iOS并未本地翻译该图像。您必须使用自己拥有的第三方库或代码来显示该图像。

根据您的评论,有一个KingfisherWebp可以做到。