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
相关产品推荐
相关产品推荐

