Android端通过JSON Rest服务传输JPG二进制文件遇阻求助
解决Android与Java服务端Base64传输JPG的问题
嘿,我明白你现在的困扰——跨端Base64编码解码总是踩坑对吧?你的问题大概率是Android自带的android.util.Base64和Java标准库的java.util.Base64在编码参数上不匹配导致的,我给你几个可行的解决方案:
方案一:统一编码参数(无需额外库)
Android的Base64.DEFAULT会自动添加换行符来满足RFC 2045的格式要求,但Java标准库的解码器默认不处理这些换行符,直接解码就会抛出类似Unexpected padding的错误。你只需要修改客户端的编码参数:
- 客户端编码时改用
Base64.NO_WRAP,避免生成换行符:
// Android客户端代码 byte[] imageBytes = ...; // 你的JPG二进制数据 String encodedImage = Base64.encodeToString(imageBytes, Base64.NO_WRAP);
- 服务端解码前先确保字符串没有多余的空格或换行(虽然用NO_WRAP后基本不会有,但保险起见):
// Java服务端代码 String receivedEncodedString = ...; // 从JSON中获取的编码字符串 byte[] decodedImageBytes = Base64.getDecoder().decode(receivedEncodedString.trim());
方案二:使用第三方统一库(更稳妥)
如果不想纠结系统API的差异,推荐用Apache Commons Codec的Base64实现,客户端和服务端都用同一个库,兼容性拉满:
- 客户端(Android)添加依赖后,编码代码:
import org.apache.commons.codec.binary.Base64; byte[] imageBytes = ...; String encodedImage = Base64.encodeBase64String(imageBytes);
- 服务端(Java)同样用这个库解码:
import org.apache.commons.codec.binary.Base64; String receivedEncodedString = ...; byte[] decodedImageBytes = Base64.decodeBase64(receivedEncodedString);
(注:Eclipse里可以直接把commons-codec的jar包导入项目,或者用Maven/Gradle管理依赖)
额外调试技巧
- 编码后在客户端打印字符串的前20位和后20位,服务端接收后也打印相同位置的内容,对比是否一致——如果不一致,说明JSON传输过程中字符串被转义或截断了,要检查JSON序列化/反序列化的逻辑(比如有没有把双引号转义成
\"但解码时没处理)。 - 可以用在线Base64工具验证编码后的字符串是否能正常解码,排除编码本身的问题。
内容的提问来源于stack exchange,提问作者boris
相关产品推荐
相关产品推荐

