背景
在完成pdf生成需求时,pdf里需要插入图片,结果报错java.io.IOException: http://xxx.png is not a recognized imageformat. 但是如果将 url 粘贴到浏览器中,则会返回正确的图像。如果使用本地图片,也可以成功。
原因
如果从 URL 请求图像,它必须实际指向该图像。如果 URL 指向一个网页,然后重定向到另一个 URL(或者 URL 的返回代码是重定向),那么将失败。而浏览器默认是不允许在 https 里面引用 http 资源的,一般都会弹出提示框。此处我使用了http开头的图片地址,所以当我访问该图片的时候相当于重定向了(https -> http,如下图),所以pdf获取图片失败了。
这本质上是由于 getInstance() 方法了解如何使用 HTTP 定位协议来获取文件,但对 HTTP 协议的了解不足以成为 HTTP 客户端。
解决方法
- 使用 https 的地址(用域名访问远程图片)
- 将图像存储在程序中的文件中,再通过代码动态获取图片在程序里的路径。(代码如下)
/**
* 动态获取资源目录下资源的路径
* @param fileName 资源文件名 如:STSONG.TTF
* @param newChildPath 新文件所在子路径 如:/font
* @return 资源最终所在路径
* @throws IOException
*/
public static String getFileDynamic(String fileName,String newChildPath) throws IOException {
// 获取类路径下的文件路径
File path = new File(ResourceUtils.getURL("classpath:").getPath());
if (!path.exists()) {
path = new File("");
}
log.info("path = {}", path.getAbsolutePath());
File upload = new File(path.getAbsolutePath(), newChildPath);
if (!upload.exists()) {
upload.mkdirs();
}
String resources = upload.getAbsolutePath() + File.separator + fileName;
log.info("resources = {}", resources);
return resources;
}