解码base64字符串在swift中出错了

上下文如下:我编写了一个应用程序,可以从库中选择一个图像,然后将图像转换为base64字符串,如下所示:

let imageData:NSData = UIImageJPEGRepresentation(self.myImageView.image!, 0.1)! as NSData let strBase64 = imageData.base64EncodedString(options: .lineLength64Characters) 

这里myImageView是人们选择图像时存储图像的地方。 然后我将它上传到我的本地mysql数据库,其中我有MEDIUMTEXT类型的列。 然后我编写了一个可以从数据库中获取此字符串的应用程序,但是当我想要解码它并再次使其成为UIimage时,我的程序失败了。 这是我试过的:

  let dataDecoded:NSData = NSData(base64Encoded: tempString64, options: NSData.Base64DecodingOptions(rawValue: 0))! let decodedimage:UIImage = UIImage(data: dataDecoded as Data)! 

这里tempString64是我从数据库中获取的字符串(我还检查它不是空的)。 如果我运行应用程序,我会在尝试打开它时收到dataDecoded为nil的错误。 我真的不明白为什么它是零,而我的临时信息确实存在。

谢谢。

更新:我尝试了很多东西,但它没有用! 以下是我在URLSession中使用的代码的相关部分:

  if data != nil { do { let imagesJSON = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! NSDictionary let images : NSArray = imagesJSON["images"] as! NSArray let temp : NSArray = images[0] as! NSArray var tempString64 : String = temp[0] as! String // I found a question on this site that said that the string should be of length multiple of 4, the following does that. let remainder = tempString64.count % 4 if remainder > 0 { tempString64 = tempString64.padding(toLength: tempString64.count + 4 - remainder, withPad: "=", startingAt: 0) } //check if string is not nil print(tempString64) let dataDecoded = Data(base64Encoded: tempString64) let decodedimage = UIImage(data: dataDecoded!) DispatchQueue.main.async { self.myImageView.image = decodedimage } } catch { print(error) } } 

tempString64的尾巴

 wBr9KavclvUrxPlNp6ircQ5qNLTDfe/Sr8Vvj L9KqS0BbEM2AKz2rXmt8j736VRNr/ALX6UJEmcv3qnPSpRZ/N979Kn y8fe/SqKiZhNJV1rP/AGv0pPsf 1 lEkJlFhkYpAoQe9aH2Pj736VE1n/t/pTV7DRXjPzVpL0qGCy5yX/StEW2B979KLFrYzpadafxfhU8ltn L9Kktrbbu b07Uraktn/2Q== 

tempString64的长度为13752

该问题是由lineLength64Characters选项引起的。 如果指定了此选项,则必须使用选项ignoreUnknownCharacters对数据进行解码

 let dataDecoded = Data(base64Encoded: tempString64, options: .ignoreUnknownCharacters)! 

但是省略所有选项要容易得多。 无论如何,数据库并不关心好的格式。

 let strBase64 = imageData.base64EncodedString() ... let dataDecoded = Data(base64Encoded: tempString64)! 

更新:

删除填充代码并安全地获取编码的字符串。 API为您处理填充。

不要在Swift中使用NSArrayNSDictionary ,使用本机类型的安全类型。 永远不要使用.mutableContainers特别是将值赋给im可变常量。 Swift中的选项毫无意义。

  if let data = data { do { if let imagesJSON = try JSONSerialization.jsonObject(with: data) as? [String:Any], let images = imagesJSON["images"] as? [Any], let temp = images.first as? [String], let tempString64 = temp.first { print(tempString64) let dataDecoded = Data(base64Encoded: tempString64) let decodedimage = UIImage(data: dataDecoded!) DispatchQueue.main.async { self.myImageView.image = decodedimage } } } catch { print(error) } }