我正在iOS上使用Realm(Sync(作为后端开发SwiftUI应用程序。我一直在关注o-fish(WildAid o-fish移动应用程序背后的Realm数据和分区策略|MongoDB(的文章,以使用户能够在离线时附加图片。
我的照片型号:
class Photo: Object, ObjectKeyIdentifiable {
@Persisted(primaryKey: true ) var _id: ObjectId
@Persisted var picture: Data?
@Persisted var pictureUrl: String
convenience init (pictureUrl: String = "", picture: Data? = Data()) {
self .init()
self .pictureUrl = pictureUrl
self .picture = picture
}
出于测试目的,在我的iOS应用程序代码中,我在如下领域中写作:
.onChange(of: image) { _ in
if(image != nil) {
if let newData = image!.jpegData(compressionQuality: 0.5) {
try! realm.write {
realm.add(Photo(picture: newData))
}
}
}
}
正如文章中所解释的,它将触发应用程序服务上的功能:(1(上传到S3,(2(用S3生成的链接替换字段ID。
我创建了我的AWS S3 bucket,并通过上传功能在上面上传了一些blob。
exports = async function(imageName, file) {
const AWS = require('aws-sdk');
AWS.config.update({
accessKeyId : <key>
secretAccessKey : <key>,
region: <region>
});
const s3 = new AWS.S3({apiVersion: '2006-03-01'})
const bucketName = <bucket name>
return s3.upload({
"Bucket": bucketName,
"Key" : imageName,
"Body": file.toBase64(),
"ACL": "public-read",
"ContentType": "image/jpeg",
}).promise()
}
关于我的问题:据我所知,保存在S3上的文件是base64格式的。因此,不可能从S3下载文件并在图像查看器中打开它,这是正确的吗?此外,我现在正试图在iOS应用程序上显示base64图像,但我只收到解码错误…:
let (data, _) = try await URLSession.shared.data(from: URL) // URL is the new S3 image link
If let image = UIImage(data: Data(base64Encoded: data.base64EncodedString())!) {
...
}
在图像链接上进行卷曲会产生一个看起来像的长字符串
/9j/4AQSKZJRgABAQAASABIAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEIdpAAQAAAAAAJgAAAAAAA6ABAAMAAAAAAAAAKAAAAAAAJxAAAAAD/wAARCANEBoQDASIAAhEBaxEBA/8QAHwAAAQBAQEBAQEAAAAAAAAAWQFBgcICQoL/…
我在S3上传或Swift/SwiftUI解码中缺少什么吗?
尝试这个示例代码,将接收到的data
转换为String
,然后base64对其进行解码,以用于UIImage
:
if let str = String(data: data, encoding: .utf8), let imageData = Data(base64Encoded: str) {
let img = UIImage(data: imageData) ?? UIImage()
}