Flutter中Base64字符串转图片触发无效字符异常的问题排查
我来帮你梳理下这个问题的排查方向,看起来是Flutter的base64解码逻辑和Java端的编码输出之间出现了兼容性问题,以下是几个关键的排查点:
检查Java端Base64编码的参数
Java中Base64.DEFAULT这个参数会在编码后的字符串中自动插入换行符(\n)来分割长内容,但Flutter的base64Decode函数对输入格式要求非常严格,任何非标准Base64字符(包括换行符)都会触发解码错误。而在线转换工具通常会自动忽略这些换行符,所以才会出现在线能转但Flutter报错的情况。
建议把Java代码里的编码参数改成Base64.NO_WRAP,这样就不会生成换行符了:public static String encodeToBase64(Bitmap image) { Bitmap imagex=image; ByteArrayOutputStream baos = new ByteArrayOutputStream(); imagex.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] b = baos.toByteArray(); // 替换为NO_WRAP参数,避免生成换行符 String imageEncoded = Base64.encodeToString(b, Base64.NO_WRAP); return imageEncoded; }校验Base64字符串的完整性与一致性
跨平台传输过程中,字符串可能会被截断、添加额外空格或特殊字符。你可以把Java生成的Base64字符串和在线转换成功的版本做对比,重点检查报错位置(第77位的C)前后的内容是否一致,看看有没有出现字符缺失或多余的情况。排查Flutter端的字符串处理逻辑
确保你在Flutter中拿到的stringBase64没有被额外转义或修改,比如是否不小心把/转成了\/,或者被添加了引号之类的。可以在Flutter中打印出字符串的前100个字符,和Java端输出的原始字符串做对比,确认两者完全一致。临时修复:在Flutter端清理Base64字符串
如果暂时无法修改Java代码,可以在Flutter端先对Base64字符串做清理,移除所有非标准Base64字符(包括换行符、空格等)后再解码:// 清理所有非Base64允许的字符 String cleanedBase64 = stringBase64.replaceAll(RegExp(r'[^A-Za-z0-9+/=]'), ''); Image.memory(base64Decode(cleanedBase64));
内容的提问来源于stack exchange,提问作者Ateeg Razi

