Swift 4中如何将通过Gmail API下载的邮件附件格式转换为字节
在Swift 4中将Gmail API获取的附件Base64字符串转成字节数据
嘿,刚好做过类似的需求!你拿到的这段字符串是Base64编码的内容(开头的JVBERi0xLjQ其实是PDF文件的Base64特征开头,说明这应该是个PDF附件)。Gmail API返回的附件内容默认都是Base64编码的,所以我们要做的就是把它解码成Swift里的Data类型——这就是你要的字节数据啦。
下面是具体的实现步骤:
第一步:处理URL安全的Base64(如果需要的话)
Gmail API有时候返回的是URL安全的Base64,也就是把标准Base64里的+换成-,/换成_,还可能省略末尾的=填充符。这种情况下直接解码会失败,所以得先把它转成标准Base64格式:
func convertBase64UrlToStandard(_ base64UrlString: String) -> String { var standardBase64 = base64UrlString .replacingOccurrences(of: "-", with: "+") .replacingOccurrences(of: "_", with: "/") // 补充必要的=填充,因为Base64的长度必须是4的倍数 let paddingCount = 4 - (standardBase64.count % 4) if paddingCount < 4 { standardBase64 += String(repeating: "=", count: paddingCount) } return standardBase64 }
第二步:解码成Data(字节数据)
格式处理好之后,就可以用Swift自带的Data初始化方法解码了,非常方便:
// 把你从Gmail API拿到的附件字符串放这里 let gmailAttachmentBase64 = "JVBERi0xLjQKMSAwIG9iago8PAovVGl0bGUgKP7_AGkATwBTACAAJgAgAE8AYgBqAGUAYwB0AGkAdgBlAC0AQwAgAFIAZQBwAG8AcgB0KQovQ3JlYXRvciAo_v8pCi9Qcm9kdWNlciAo_v8AdwBrAGgAdABtAGwAdABvAHAAZABmKQovQ3JlYXRpb25EYXRlIChEOjIwMTcwNTEyMDMyODU4LTA0JzAwJykKPj4KZW5kb2JqCjMgMCBvYmoKPDwKL1R5cGUgL0V4dEdTdGF0ZQovU0EgdHJ1ZQovU00gMC4wMgovY2EgMS4wCi9DQSAxLjAKL0FJUyBmYWxzZQovU01hc2sgL05vbmU-PBu4r_AK4NIiSnFYpcMAV6XNeRN1bjMD1NUT5VdhH_ACJNZ48dsjhHnky1..." // 先转成标准Base64(如果你的字符串是URL安全的话,要是标准的可以跳过这步) let standardBase64 = convertBase64UrlToStandard(gmailAttachmentBase64) // 解码成Data if let attachmentData = Data(base64Encoded: standardBase64) { // 这里的attachmentData就是你要的字节数据了! print("解码成功,数据大小:\(attachmentData.count)字节") // 要是你想把它存成文件(比如PDF),可以这样做 guard let docsDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { print("找不到文档目录") return } let saveUrl = docsDir.appendingPathComponent("downloaded_attachment.pdf") do { try attachmentData.write(to: saveUrl) print("附件已保存到:\(saveUrl.path)") } catch { print("保存文件出错:\(error.localizedDescription)") } } else { print("解码失败啦!可能是Base64字符串格式有问题,你可以先在线验证一下字符串是否有效") }
几个要注意的点
- 如果你确定拿到的是标准Base64(没有
-和_,长度是4的倍数),那直接用Data(base64Encoded: gmailAttachmentBase64)就行,不用第一步的转换。 - 解码失败的常见原因:字符串里混了非Base64字符,或者URL安全格式没转对,你可以先把字符串复制到在线Base64解码工具里试试,确认它是有效的编码。
内容的提问来源于stack exchange,提问作者user9364391
相关产品推荐
相关产品推荐

