You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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处理,大概率是请求体构造或编码细节的问题。

正确步骤

  1. 获取PDF的二进制数据:
Uint8List pdfBytes = await pdf.save();
  1. 将二进制数据编码为Base64字符串:
import 'dart:convert';

String base64Pdf = base64Encode(pdfBytes);
  1. 构造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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 15:45:51