通过http请求从另一个项目获取图片流并返回该图片流踩到的坑

通过http请求从另一个项目获取图片流并返回该图片流踩到的坑

项目场景:

最近有一个需求需要获取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();
	}
}

这回终于将这一问题解决了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值