Apple的b64数据标准是否合适?

时间:2018-03-09 13:06:40

标签: ios swift rest base64

如果这看起来像是一个骗局,抱歉。我试图提出一个非常具体的问题,并且不确定我的搜索是否真的让我到了正确的地方。无论如何,这里是设置。在iPhone相机上拍照,将其转换为base64字符串数据,将其连接到Node API,将其转换为文件以推送到S3。挺直的。

一般免责声明适用;我更喜欢在JSON中使用B64字符串以简化和普遍性,并且我不会对表单编码上传的愚蠢做进一步评论:)

这是我生成B64的非常简单的Swift代码,将其转换回图像,并将其显示为这些东西的工作原理 - 至少在Apple的土地上。

注意:" redButton"是我的应用程序中的资产之一。为了在API上发送更小的数据包进行测试,我切换到了那个,但结果仍然存在。感谢。

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        // build data packet
        imagePicker.dismiss(animated: true, completion: nil)
        //let image:UIImage = (info[UIImagePickerControllerOriginalImage] as? UIImage)!
        let image:UIImage = UIImage(named: "redButton")!
        showAlert( title: "size", msg: String( describing: image.size ) )
        let data = UIImageJPEGRepresentation(image, 0.5)
        let b64 = data!.base64EncodedData()//.base64EncodedString()//options: Data.Base64EncodingOptions.lineLength64Characters)
        let b64String = b64.base64EncodedString()
        debugPrint( "len=" + String( describing: b64String.lengthOfBytes(using: String.Encoding.utf8)))
        let newDataString = Data.init(base64Encoded: b64String )
        let newData = Data.init(base64Encoded: newDataString! )
        let newImage = UIImage.init(data: newData!)
        tmpImage.image = newImage
}

这一切都有效。我在小UIImage中看到了图像。

至少完全在Apple阵营中, img-> b64-> img 有效。

...然而

当我复制b64编码的字符串数据的实际结果blob,并手动将其粘贴到source属性中,用数据填充标记时,它不会显示预期的图像,事实上,只显示一个损坏的图像在浏览器中。

...即

<html>
<body>
    <img src="data:image/jpg;base64,LzlqLzRBQVFTa1pKUmdBQkFRQUFTQUJJ (brevity)...">
</body>
</html>

那么,我在HTML页面的校对中做错了什么?我是否期望Apple称之为base64字符串数据的错误结果?我只是简单地遗漏了一些痛苦明显的东西,我睡眠不足的大脑缺失了吗?

它最终会在HTTP POST调用中被发送到服务器,按照正常的方式,作为字典,通过较新的Swift中的json编码内容转换为json。

var params = ["image": [ "content_type": "image/jpg", "filename":"test.jpg", "file_data": b64String] ]

为了充实,这里是节点代码,我将这些数据重新组合成一个二进制位,从这里我把它推到S3系统,并且在每种情况下,文件都无法被识别作为一个合适的JPG文件。

var b64 = req.body.image.file_data;
var base64data = new Buffer(b64, 'base64'); // according to all the new-node version docs

我正处于一个紧缩时期产品的主页上,我们将在下周向投资者推销,显然这是展示该会议的关键特征。

告诉我,我错过了一些非常明显的事情,而且我是愚蠢的。我欢迎你。它不可能只是一些愚蠢的事,对吧?

谢谢!

1 个答案:

答案 0 :(得分:1)

下面:

let b64 = data!.base64EncodedData()
let b64String = b64.base64EncodedString()

您对给定数据进行两次编码。应该只是

let b64String = data!.base64EncodedString()

你的“Apple in land”测试有效,因为

let newDataString = Data.init(base64Encoded: b64String )
let newData = Data.init(base64Encoded: newDataString! )

也会对Base64进行两次解码。那现在只是

let newData = Data(base64Encoded: b64String)