项目场景:
最近有一个需求需要获取B项目所在服务器的图片,但是该图片保存在数据库的路径是绝对路径,没找到合适的方法直接从该服务器拿到,只能通过调B项目的获取图片流的接口来获取该图片。问题描述:
我写了http请求从B项目的接口获取该图片流,然后对得到的图片流进行处理再返回出去,但是遇到了偶尔可以完整返回,经常出现图片内容不同程度丢失的问题。这里贴出图片流处理有问题的部分代码OutputStream output = null;
InputStream imageIn = null;
try {
imageIn = userService.getUserPhotoStream(accCode);
output = response.getOutputStream();
byte[] buffer = new byte[imageIn.available()];
imageIn.read(buffer);
output = response.getOutputStream();
output.write(buffer);
output.flush();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (null != output) {
output.close();
}
if (null != imageIn) {
imageIn.close();
}
}
第一次原因分析:
这里我首先想到的是时延问题,在流还完全获得的时候就将该流返回出去了第一次解决方案:
于是我在合适的位置加入了线程休眠代码try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
结果他没问题了,然后我兴高采烈的换了几张图片测试,问题又来了,这次是有些图片只能显示一部分,而且每次显示的都是那一部分,我就考虑是线程休眠时间设置短了,但是无论我现场休眠时间设置为多少,都还是只显示那部分的图片。
第二次原因分析:
这回我在网上寻求解决方案,看有没有人遇到类似的问题,最终发现一位大佬道出了真相,imageIn.available()也就是InputStream的available()会受网络波动的影响,在处理本地图片时是没问题的,但是从网络上拿流进行处理可能会出现问题,那就只能换一种写法来处理了。第二次解决方案:
以下是我修改后的代码OutputStream output = null;
InputStream imageIn = null;
try {
imageIn = userService.getUserPhotoStream(accCode);
output = response.getOutputStream();
byte[] buffer = new byte[10*1024*1024];
int len = 0;
while((len=imageIn.read(buffer))!=-1) {
output.write(buffer, 0, len);
}
output.write(buffer);
output.flush();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (null != output) {
output.close();
}
if (null != imageIn) {
imageIn.close();
}
}
这回终于将这一问题解决了