从 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 仅处理 NSNumberNSStringNSNullNSDictionaryNSArray 的值。你的例子有一个字符串是"Optional(71918 bytes)"。您不能只将 NSString 转换为 Data。那总是会失败的。

    您不能只在 JSON 中包含图像负载的二进制数据。这里有两种选择:

    您可以让您的服务器在将图像负载添加到 JSON 之前对其进行 base-64 编码(使传输的内容比实际图像资产大 33%),然后应用程序可以在从JSON。

    使用DecodableJSONDecoder 可以自动将此base-64 字符串解析为Data,但如果使用JSONSerialization,则必须手动进行。

    不要在 JSON 中包含图片,而是提供一个 URL,客户端可以通过该 URL 单独下载图片。 

    但 JSON 是一种文本表示,而图像是二进制资产。

【讨论】:

谢谢,我会改变我的方法并使用图片的网址。

以上是关于从 SQL 将图像作为数据下载到 iOS的主要内容,如果未能解决你的问题,请参考以下文章

iOS 将视频作为下载数据播放

在 iOS 应用中为动态下载的图像添加样式

在 iOS 设备中保存从 Web 下载的图像的最佳位置?

使用 alamofire 下载图像 - iOS

使用 cordova 文件传输将图像/视频保存到 IOS 中的画廊

无法使用从 getDownloadUrl 下载的 Firestore 存储 URL 作为图像 src