Dart中如何创建不落地存储的File变量?用于PDF转Base64发送
解决Dart中生成PDF并通过Sendgrid发送Base64编码附件的问题
问题背景
我正在使用Dart的pdf包生成PDF,官方给出的保存PDF到本地的代码如下:
// On Flutter, use the path_provider library: // final output = await getTemporaryDirectory(); // final file = File("${output.path}/example.pdf"); final file = File("example.pdf"); await file.writeAsBytes(await pdf.save());
我需要通过Sendgrid发送这个PDF作为Base64编码的附件,尝试了以下代码:
Uint8List unitEncodedPDF = await pdf.save(); String baseEncodedPDF = base64Encode(unitEncodedPDF);
但将baseEncodedPDF传入Sendgrid POST请求体的content字段后,收到错误提示:"The attachment content must be base64 encoded."
我原本以为需要先把PDF保存为Dart的File对象,再转成Uint8List最后编码成Base64,但File.writeAsBytes会将文件写入用户设备存储,我的数据比较敏感,不想落地存储,只希望通过API直接发送。请问有没有办法不实际写入存储就能完成Base64编码,或者创建不落地的File变量?
解决方案
核心结论:不需要创建File对象,直接在内存中处理即可
你完全不需要将PDF写入本地存储,pdf.save()返回的Uint8List本身就可以直接转成符合Sendgrid要求的Base64编码,之前的错误并非因为没经过File处理,大概率是请求体构造或编码细节的问题。
正确步骤
- 获取PDF的二进制数据:
Uint8List pdfBytes = await pdf.save();
- 将二进制数据编码为Base64字符串:
import 'dart:convert'; String base64Pdf = base64Encode(pdfBytes);
- 构造Sendgrid请求体时,注意以下关键细节:
- 附件的
content字段必须是纯Base64字符串,不能包含任何换行、空格或额外字符 - 必须指定附件的
type为application/pdf - 设置正确的
filename和disposition: "attachment"
- 附件的
完整请求体示例(JSON格式)
{ "personalizations": [ { "to": [{"email": "recipient@example.com"}] } ], "from": {"email": "sender@example.com"}, "subject": "PDF附件邮件", "content": [{"type": "text/plain", "value": "请查收附件PDF"}], "attachments": [ { "content": "你的base64Pdf字符串", "filename": "document.pdf", "type": "application/pdf", "disposition": "attachment" } ] }
常见错误排查
- 如果仍然收到编码错误,检查
base64Encode后的字符串是否被意外转义(比如JSON序列化时自动添加了转义符) - 确保Base64字符串没有被截断或添加了多余的空白字符
- 确认Sendgrid API的请求头设置正确(
Content-Type: application/json)
内容的提问来源于stack exchange,提问作者Jiehfeng
相关产品推荐
相关产品推荐

