如何将Postgres生成的Base64在Java中转为byte[]并解决解码报错
问题解决方案
报错原因
Last unit does not have enough valid bits
该报错的核心原因是Java端拿到的Base64字符串不符合解码规则,结合你的使用流程,常见触发场景分为三类:
- Postgres默认生成的Base64每76个字符自带一个换行符,Java默认解码器无法识别这类非Base64合法字符
- Base64字符串长度不是4的倍数,要么是缺填充符
=,要么是内容被截断 - 字符串首尾存在多余的空格、制表符等非法字符
可行解决方案
方案1:数据库端生成无换行的Base64(推荐,从源头避免格式问题)
修改原SQL,将encode生成的Base64中的换行符移除后再存入clob字段:
REPLACE(encode(bytedata::bytea, 'base64'), CHR(10), '')
方案2:Java端适配MIME格式的Base64
如果不希望修改数据库逻辑,直接替换Java的解码器,使用支持自动忽略换行、空格等非法字符的MIME解码器即可:
import java.util.Base64; // 读取clob转换为字符串后执行以下逻辑 String clobContent = yourClobToStringMethod(); // 先去除首尾空白,再用MIME解码器解码 byte[] originBytes = Base64.getMimeDecoder().decode(clobContent.trim());
方案3:手动补全Base64填充符
如果排查后确认是填充符=丢失导致长度不匹配,可以手动补全后再解码:
import java.util.Base64; String clobContent = yourClobToStringMethod().trim(); // 计算需要补充的填充符数量 int paddingCount = (4 - clobContent.length() % 4) % 4; if (paddingCount > 0) { clobContent += "=".repeat(paddingCount); } byte[] originBytes = Base64.getMimeDecoder().decode(clobContent);
内容的提问来源于stack exchange,提问作者vignesh28
相关产品推荐
相关产品推荐

