需求:用户请求URL,根据请求内容加载网络图片并显示到用户端。
涉及步骤:
1、根据URL下载图片
2、将图片写出到客户端查看
问题:图片加载失败或出现残缺问题
原因:inputStream.available()读数异常,在本地加载图片时available方法一般没有问题,但是加载URL图片地址时,因为通讯过程中,字节不是一次性传输而是分批次传输的,直接导致在获取长度时图片的大小不一致,造成文件长度错误缺失数据。获取文字长度建议使用:
connection.getContentLength() 以协议头约定的字节长度为准
附功能代码:
/**
* 获取http图片流
* @author LengChen
* @version 1.0
* @date 2022-03-10
*/
public class HttpUtils {
/**
*
* @description: 从服务器获得一个输入流(本例是指从服务器获得一个image输入流)
* @author: LengChen
* @date: 2022年03月10日
* @return
*/
public static Map<String, Object> getInputStream(String urlPath) {
try {
Map<String, Object> map = new HashMap<String, Object>();
HttpURLConnection connection = (HttpURLConnection) new URL(urlPath).openConnection();
connection.setReadTimeout(5000);
connection.setConnectTimeout(5000);
connection.setRequestMethod("GET");
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
InputStream inputStream = connection.getInputStream();
System.out.println(inputStream.available());
System.out.println();
map.put("inputStream",inputStream);
map.put("length",connection.getContentLength());
return map;
}
} catch (IOException e) {
System.out.println("获取网络图片出现异常,图片路径为:" + urlPath);
e.printStackTrace();
}
return null;
}
/**
*
* @description: 将输入流输出到页面
* @author: LengChen
* @date: 2022年03月10日
* @param resp
* @param inputStream
*/
public static void writeFile(HttpServletResponse resp, InputStream inputStream) {
OutputStream out = null;
try {
out = resp.getOutputStream();
int len = 0;
byte[] b = new byte[1024];
while ((len = inputStream.read(b)) != -1) {
out.write(b, 0, len);
}
out.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
@GetMapping("/downImg/{fileId}")
public void downloadNet(@PathVariable("fileId") String fileId,HttpServletResponse response) throws IOException {
// 服务器图片url
String urlPath = "http://XXXXX";
// 从服务器端获得图片,并输出到页面
Map<String,Object> map = HttpUtils.getInputStream(urlPath);
response.setContentType("image/jpeg");
InputStream inputStream = (InputStream) map.get("inputStream");
response.setContentLength((Integer) map.get("length"));
HttpUtils.writeFile(response, inputStream);
}