PFUser.current()?.saveInBackground 错误与 UIImage()

Posted

技术标签:

【中文标题】PFUser.current()?.saveInBackground 错误与 UIImage()【英文标题】:PFUser.current()?.saveInBackground ERROR with UIImage() 【发布时间】:2018-02-07 18:57:36 【问题描述】:

我想将 UIImage 中的图像保存为 PFFile。但后来我得到了错误:

Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo=NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.

正如您将在 sn-p 中看到的那样,我打印了图像的数据并得到了一些东西。 如果我向当前用户评论图像的设置,一切正常(显然没有图像)。

知道去哪里看吗?

@IBAction func updateProfil(_ sender: Any) 
        PFUser.current()!["isFemale"] = genderSwitch.isOn

        if let image = profilImage.image 
            print(image)
            if let data = UIImagePNGRepresentation(image) 
                print(data)
                PFUser.current()!["image"] = PFFile(name: "profile.png", data: data)
                PFUser.current()?.saveInBackground(block:  (s, e) in
                    if e != nil 
                        print(e as Any)
                        self.getErrorFromServer(errServeur: e, errMessage: "Update Failed")
                     else 
                        self.showSuccessMessage(m: "Info uploaded")
                        print("Data Saved !")

                        self.performSegue(withIdentifier: "updatedProfile", sender: nil)
                    
                )
            
        
    

print(image)print(data)分别给我:

<UIImage: 0x6080000a8580> size 1200, 704 orientation 0 scale 1.000000
1411255 bytes

【问题讨论】:

哪一行导致错误——创建文件还是保存用户? 我深入挖掘,似乎如果我选择一张图片(使用 imagePickerController 从库中)并将其放入一个 UIImage 中,其中的图片已经为 PNG 格式,一切正常。但如果它是 JPEG,它就失败了。我认为UIImagePNGRepresentation 会将 UIImage 数据转换为 PNG 源是什么? 您是如何安装解析服务器实例的?你使用的是 nginx 还是一些反向代理? 我认为这与最大限制有关。您能否尝试将 UIImagePNGRepresentation(image) 替换为 let data = UIImageJPEGRepresentation(image, 0.1) let f = PFFile(name: "image.jpg", data: data, contentType: "image/jpeg") 并重试? 我会在答案中提供(因为你可以控制它)所以请在 2 分钟内阅读 【参考方案1】:

这通常是由于文件的大小而发生的。 ma​​xUploadSize 是解析服务器配置选项之一。它的默认值为 20MB 意味着您将无法上传大于 20MB 的文件。您可以在解析服务器配置中将此值覆盖为 100MB(除非您正在处理非常大的文件,例如:视频等)

我认为对您来说最好的解决方案也是在将图像上传到解析服务器之前压缩图像。压缩图像会显着减小其大小并保持其质量(因为 JPEG 压缩),因此在上传图像之前,您需要执行以下操作:

    let data = UIImageJPEGRepresentation(image, 0.5)
    let f = PFFile(data: data, contentType: "image/jpeg")

0.5 是质量,它的最大值是 1,但如果你将它设置为 0.5 甚至 0.4,你会得到一个非常好的结果。此外,您可以通过缩小图像来压缩图像。这也将显着减小其大小,但它确实取决于您的用例。

在解析服务器端增加大小应该如下所示:

var server = ParseServer(
  ...otherOptions,
  // Set the max upload size of files
  maxUploadSize: 100MB,
  ....
);

祝你好运

【讨论】:

谢谢你真棒!但是这个限制是由于 16Mb/文档的 mongoDB 限制吗?如果我设置,比如说 100MB,比如你的例子,Parse 是否使用 GridFS 或其他东西? 默认情况下它使用 GridFS,但我强烈建议您使用存储服务(例如 Amazon S3)。这真的很简单,它将使您的解决方案更具规模。

以上是关于PFUser.current()?.saveInBackground 错误与 UIImage()的主要内容,如果未能解决你的问题,请参考以下文章

如何在watch app上访问PFUser.Current()

查询 findObjectsInBackground 不起作用

密码更改解析快速

Parse 平台中会话过期时重复的匿名用户

使用 iOS 增加 PFFile 解析上传大小

收到消息时将徽章添加到聊天按钮