java生成word请求远程图片或者本地图片,个别图片不全或者图片显示失败

生成的工具用的是freemarker模板,利用word转换xml改后缀名生成ftl 模式。

问题:个别图片显示不全或者显示失败


图片显示失败
图片显示不全

出现问题的代码:

InputStream in=null;

if(flag) {//获取远程图片

//new一个URL对象   

URL url = new URL(path);   

//打开链接   

HttpURLConnection conn = (HttpURLConnection)url.openConnection();   

//设置请求方式为"GET"   

conn.setRequestMethod("GET");   

//超时响应时间为5秒   

// conn.setConnectTimeout(5 * 1000);   

//通过输入流获取图片数据   

in = conn.getInputStream();

}else {//获取本地图片

File file = new File(path);

in = new FileInputStream(file);

}

byte[] data = null;

data = new byte[in.available()]; //=======问题:InputStream 的 available() 返回的值是该InputStream 在不被阻塞的情况下,一次可以读取到

// 的数据长度。但网络情况总是不定的,经常阻塞。

in.read(data);

in.close();

BASE64Encoder encoder = new BASE64Encoder();

String base64 = encoder.encode(data);

解决办法:循环读取 InputStream 中的数据。

        ByteArrayOutputStream data = new ByteArrayOutputStream();

        URL url = new URL(path);

        byte[] by = new byte[1024];

        // 创建链接

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        conn.setRequestMethod("GET");

        conn.setConnectTimeout(5 * 1000);

        InputStream is = conn.getInputStream();

        // 将内容读取内存中

        int len = -1;

        while ((len = is.read(by)) != -1) {

            data.write(by, 0, len);

        }

        // 关闭流

        is.close();

        BASE64Encoder encoder = new BASE64Encoder();

        String base64 = encoder.encode(data.toByteArray());

你可能感兴趣的:(java生成word请求远程图片或者本地图片,个别图片不全或者图片显示失败)