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

Dio获取Base64格式PDF后,本地解码保存仅显示第一页的问题

问题排查与解决

1. 检查Dio请求的ResponseType配置

如果你的Dio请求没有显式设置responseType为ResponseType.plain,可能导致Base64字符串被JSON解析截断或格式错误。Dio默认的responseType是json,当服务器返回纯Base64字符串时,JSON解析可能引入额外转义或截断内容。

修改请求代码,添加该配置:

Response response = await dio.get(
  '你的PDF接口地址',
  options: Options(responseType: ResponseType.plain), // 关键配置
);

2. 清理Base64字符串中的无效字符

服务器返回的Base64字符串可能包含换行符、空格等空白字符,这些会导致base64Decode解码不完整。在线工具通常自动忽略无效字符,但Dart的base64Decode会严格校验格式。

解码前先清理字符串:

String cleanBase64 = response.data.replaceAll(RegExp(r'\s+'), ''); // 移除所有空白字符
Uint8List bytes = base64Decode(cleanBase64);

3. 验证文件写入的完整性

虽然你用了await File(filePath).writeAsBytes(bytes),但可以额外校验写入后的文件字节数是否和原始Uint8List长度一致,确认无写入截断:

await File(filePath).writeAsBytes(bytes);
// 验证字节数
final fileLength = await File(filePath).length();
if (fileLength != bytes.length) {
  print('文件写入不完整:原始长度${bytes.length},写入长度$fileLength');
  // 可抛出错误或重试写入
}

4. 清除旧文件或更换文件名

如果之前保存过同名PDF,OpenFilex可能读取旧缓存文件而非新写入的文件。可以提前删除旧文件或更换文件名:

final file = File(filePath);
if (await file.exists()) {
  await file.delete(); // 删除旧文件
}
await file.writeAsBytes(bytes);
OpenFilex.open(filePath);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 15:40:28