最近在项目中种遇到了一个比较奇葩的问题,需求要求上传图片要的是图片的二进制流,而不是常用的模式,上传到图片到服务器用返回的url(http://xxxx...)形式的方式保存到数据库,
顺便附上转二进制的代码:
/**
* 图片文件转Base64字符串 * @param path 文件所在的绝对路径加文件名
*
* @return
*/
private String fileBase64String(String path) {
try {
FileInputStream fis = new FileInputStream(path);
//转换成输入流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int count = 0;
while ((count = fis.read(buffer)) >= 0) {
baos.write(buffer, 0, count);//读取输入流并写入输出字节流中
}
fis.close();//关闭文件输入流
String uploadBuffer = new String(Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT)); //进行Base64编码
return uploadBuffer;
} catch (Exception e) {
return null;
}
}
进入正题,
通过Glide用二进制的方式加载图片的时候有问题了,第一次加载二进制图片是没有问题的能正常显示,但是再次选择新的图片转换成二进制,再进行显示的时候,新的图片并不能正常显示,找了大半天的原因最终在Glide源码发现有设置一个
.apply(signatureOf(new ObjectKey(UUID.randomUUID())))
在内存某段时间内,设置新的二进制图片是不生效的,
最终解决:
Glide.with(mContext).load(CommonUtils.stringToByte(url))
.apply(initGlideOptions(defaultIds, errorIds))
.apply(signatureOf(new ObjectKey(url)))//设置内存一个临时的tag值,在某段时间内,如果是同一个图片就直接取内存里的
.into(imageView);
注:更新新的版本发现load(byt[] model)这个方法的源码已经变了,我没有更新,不知道新的版本有没有这个问题,
图片.png
网友评论