如果这看起来像是一个骗局,抱歉。我试图提出一个非常具体的问题,并且不确定我的搜索是否真的让我到了正确的地方。无论如何,这里是设置。在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
我正处于一个紧缩时期产品的主页上,我们将在下周向投资者推销,显然这是展示该会议的关键特征。
告诉我,我错过了一些非常明显的事情,而且我是愚蠢的。我欢迎你。它不可能只是一些愚蠢的事,对吧?
谢谢!
答案 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)