向S3(Realm、Swift)发布编码/解码文件



我正在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() 
}

最新更新