从 SQL 将图像作为数据下载到 iOS
Posted
技术标签:
【中文标题】从 SQL 将图像作为数据下载到 iOS【英文标题】:Downloading Image as data into iOS from SQL 【发布时间】:2020-08-23 20:42:01 【问题描述】:早安,
我需要我的应用从 SQL 数据库下载图像并将其保存到 Core Data。
奇怪的是我得到了图像,但是当我将它分配为 Data
时,如果我强制它会崩溃,或者当我不强制它时返回为 nil
。
我尝试了几件事,但都崩溃了。
我开始的代码如下:
if let returnedData = data
let returnedString = String(data: returnedData, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue))
print("<JON>Returned Data: \(returnedString!)")
var jsonResult = NSArray()
do
jsonResult = try JSONSerialization.jsonObject(with: returnedData, options: .allowFragments) as! NSArray
catch let error as NSError
print(error)
var jsonElement = NSDictionary()
var iData: Data?
for i in jsonResult
jsonElement = i as! [String:Any] as NSDictionary
for (v, k) in jsonElement
print("<JON> vk ",v, k)
if v as! String == "image"
print("<JON> img:")
iData = (k as? Data)
let id = jsonElement["id"] as! String
let imgData = jsonElement["image"]! as? Data
print("<JON-End>", id, imgData, iData)
由此产生的输出是
<JON>Returned Data: ["id":"E5F61103-38B7-4DCC-BA76-542AFB6A7AB0","image":"Optional(71918 bytes)"]
<JON> vk id E5F61103-38B7-4DCC-BA76-542AFB6A7AB0
<JON> vk image Optional(71918 bytes)
<JON> img:
<JON-End> E5F61103-38B7-4DCC-BA76-542AFB6A7AB0 nil nil
知道我缺少什么吗?
请注意, 乔纳斯
【问题讨论】:
【参考方案1】:一些观察:
您返回的数据不是您认为的那样。值得注意的是,与 image
键关联的值是一个 21 个字符的字符串,"Optional(71918 bytes)"
,即字符 O
,后跟 p
,然后是 t
,等等。该值是那个短字符串,而不是71kb 图片资源。
所以准备这个 JSON 的东西不包括图像,而是这个短字符串。 (顺便说一句,这个字符串看起来很像 Swift 会从一个可选项生成的字符串表示,所以我想知道图片是否上传不正确。)
您尚未分享此 JSON 是如何准备的,因此我们无法进一步评论。但我建议确认 SQL 数据库中的真正内容,并确定 SQL 数据库是否包含该字符串(表明您的原始上传例程存在问题)或 SQL 数据库是否包含图像,问题在于响应如何已创建。
JSONSerialization
仅处理 NSNumber
、NSString
、NSNull
、NSDictionary
和 NSArray
的值。你的例子有一个字符串是"Optional(71918 bytes)"
。您不能只将 NSString
转换为 Data
。那总是会失败的。
您不能只在 JSON 中包含图像负载的二进制数据。这里有两种选择:
您可以让您的服务器在将图像负载添加到 JSON 之前对其进行 base-64 编码(使传输的内容比实际图像资产大 33%),然后应用程序可以在从JSON。
使用Decodable
和JSONDecoder
可以自动将此base-64 字符串解析为Data
,但如果使用JSONSerialization
,则必须手动进行。
不要在 JSON 中包含图片,而是提供一个 URL,客户端可以通过该 URL 单独下载图片。
但 JSON 是一种文本表示,而图像是二进制资产。
【讨论】:
谢谢,我会改变我的方法并使用图片的网址。以上是关于从 SQL 将图像作为数据下载到 iOS的主要内容,如果未能解决你的问题,请参考以下文章