来自base64网址的数据

时间:2017-09-26 14:38:01

标签: swift url

我有一个

形式的网址

foo://?data:application/x-foo;base64,OjAyMDAwMDA0MDAwMEZBDQo6MTAwMDA...

现在需要将base64数据提取到Data对象中。

不幸的是,Data对象似乎还不支持

let data = try Data(contentsOf: url)

尝试时

返回NSURLConnection finished with error - code -1002

虽然我可以decode the URL manually但我想知道我是否缺少一种简单的标准方法。你会怎么做?

2 个答案:

答案 0 :(得分:2)

实际上你可以解码来自URL的Base64数据(参见 示例Base64 Decoding in iOS 7+,其中在Objective-C中进行了演示。格式与什么有点不同 你有:

let url = URL(string: "data:application/octet-stream;base64,SGVsbG8gd29ybGQh")!
let data = try! Data(contentsOf: url)

print(String(data: data, encoding: .utf8)!) // Hello world!

(为简洁起见,省略了错误检查。)

答案 1 :(得分:0)

您必须将URL的base64编码部分与其他部分分开,对其进行解码,然后将原始的非编码部分与解码部分连接起来,并从那里获取数据。

extension URL {
    init?(partialBase64Url: String){
        guard let base64part = base64Url.components(separatedBy: "base64,").last, let base64Data = Data(base64Encoded: base64part), let decodedString = String(data: base64Data, encoding: .utf8) else {
            return nil
        }
        let decodedUrl = base64Url.components(separatedBy: "base64,").dropLast().joined() + decodedString
        self.init(string: decodedUrl)
    }
}

let decodedUrl = URL(partialBase64Url: "foo://?data:application/x-foo;base64,dGVzdFVybFN0cmluZw==")

decodedUrl"foo://?data:application/x-foo;testUrlString"的值,正如预期的那样,因为dGVzdFVybFN0cmluZw==testUrlString的base64编码值。