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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 20:45:02