我有一个
形式的网址 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但我想知道我是否缺少一种简单的标准方法。你会怎么做?
答案 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编码值。