下载图片 getInputStream、available()问题

需求:用户请求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);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值