Java处理用户头像字节数组报Illegal base64 character 3a错误如何解决
问题原因
你触发报错的核心原因是:data:image/jpeg;base64,是Data URI协议的标识前缀,本身不属于Base64编码的合法字符范围,报错信息里的3a就是前缀里冒号(:)对应的ASCII码,你将带前缀的字符串直接传入Base64解码方法,自然会触发非法字符校验报错。
同时你的业务逻辑本身存在设计问题:你拼接前缀的目的是为了让浏览器可以直接识别图片,这个拼接后的字符串是给前端渲染用的文本格式,完全不需要再解码转回字节数组存回头像字段。就算你能绕过解码报错,把前缀对应的字节写入图片二进制数据里,最终得到的文件也是损坏的,无法正常打开。
解决方法
分两种常用业务场景调整代码即可:
场景1:后端直接返回前端可直接使用的图片Data URI
给UserEntity实体类新增一个String类型的字段,比如propicUri,专门用来返回拼接好的图片标识字符串,不需要修改原有的propic字节数组字段:
@GetMapping("/getUser") public UserEntity getUser(@RequestHeader("nickname") String nickname) { UserEntity user = userDAO.findUserByNickname(nickname); byte[] propicBytes = decompressBytes(user.getPropic()); // 原字节数组字段可以保留,也可以根据需要配置不返回给前端 user.setPropic(propicBytes); // 拼接好的Data URI存入新增的字符串字段返回 String propicUri = "data:image/jpeg;base64," + Base64Utils.encodeToString(propicBytes); user.setPropicUri(propicUri); return user; }
场景2:前端自行拼接前缀
你可以直接返回Base64编码后的图片字符串,或者直接返回原字节数组,由前端完成编码、拼接前缀的操作即可,不需要后端做拼接再解码的多余操作。
内容的提问来源于stack exchange,提问作者santocielo99
相关产品推荐
相关产品推荐

