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

Flutter中Uint8List转String保存PDF后损坏的解决方法咨询

问题根源

PDF是二进制文件,绝对不能用UTF-8来做字节和字符串的转换。UTF-8是给文本设计的编码格式,二进制数据里存在大量不符合UTF-8规则的字节序列,硬解码要么直接抛出异常,开了allowMalformed: true也会把非法字节替换成无效字符,导致原始数据丢失,最终恢复的PDF必然损坏。

正确做法:使用Base64编码转换

Base64就是专门用来将二进制数据转换为可安全存储/传输的文本格式的编码方式,能保证字节数据完整无损地在字符串和二进制之间转换。

修改后的保存PDF代码

import 'dart:convert'; // 必须导入这个包才能用Base64相关方法

Future<void> setFormPdf(File pdf) async {
  final String pdfKey = _getKey('pdf_name');
  final bytesData = pdf.readAsBytesSync();
  // 将二进制字节序列转换为Base64字符串
  final pdfData = base64Encode(bytesData);
  await storageConnector.setString(pdfData, pdfKey);
}

修改后的恢复PDF代码

import 'dart:convert';

final pdfPath = await getTemporaryPath('pdf_name.pdf');
final pdfData = File(pdfPath);
final String pdfKey = _getKey('pdf_name');
final stringPdf = await storageConnector.getString(pdfKey);
// 将Base64字符串转回原始二进制字节序列
final bytesPdf = base64Decode(stringPdf);
await pdfData.writeAsBytes(bytesPdf, flush: true);

补充说明

  • Base64编码后的字符串体积会比原始二进制数据增加约33%,但这是保证数据完整性的合理代价,对PDF这类文件完全适用
  • 一定要确保代码中导入了dart:convert包,否则无法调用base64Encode和base64Decode方法

内容的提问来源于stack exchange,提问作者Jhonatan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 00:44:57