一、现象描述

在开发过程中遇到了base64解码失败问题,ios和Android同时调用上传人脸数据,通过拍照拿到图片信息再装成base64字符串传给后台,此时发现ios上传的图片没有问题,Android端上传的时候后台却报了base64编解码失败,复制了日志信息的base64串去网站验证发现可以转换。

二、问题发现

经过一番折腾与思考,发现我Base64日志信息特别长,去官网验证时每次都删除调换行符,ding 灵机一动,猜测有可能是换行符原因导致

三、问题解决

在将base64字符串传给后台之前去掉换行符,经过验证确实可以解决问题,下面是去掉字符串换行符的代码,

faceBase64Url.replaceAll("[\\t\\n\\r]", "");

下面是图片转Base64的代码

public static String bitmapFaceToBase64(Bitmap bitmap) {

// 要返回的字符串

String reslut = null;

ByteArrayOutputStream baos = null;

try {

if (bitmap != null) {

baos = new ByteArrayOutputStream();

/**

* 压缩只对保存有效果bitmap还是原来的大小

*/

bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);

/**

* 压缩只对保存有效果bitmap还是原来的大小

*/

int options = 100;

// 如果大于500kb则再次压缩,最多压缩三次

while (baos.toByteArray().length / 1024 > 500 && options > 10) {

// 清空baos

baos.reset();

// 这里压缩options%,把压缩后的数据存放到baos中

bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);

options -= 10;

}

// 转换为字符串

baos.flush();

baos.close();

Log.e("bingo", "最后大小:" + baos.toByteArray().length / 1024 + "k");

reslut = Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT);

} else {

return null;

}

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

if (baos != null) {

baos.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

return reslut;

}

四、存在疑问

不知道为什么ios转换后不需要去掉换行符。android却需要处理一下。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐