加载图片
在 Luck-Report 当中,选中目标单元格,点击工具栏上的插入图片按钮,就可以插入图片,如下图所示:

插入图片后,默认只显示图片的示意图,这是因为我们要加载的图片可以是静态的,也可以是动态的,所以报表模版中以示意图的形式显示。选中图片所在单元格就可以在属性窗口中设置图片相关属性,可以看到,对于图片的来源来说,有两个选项,如下表所示:
| 图片来源 | 说明 |
|---|---|
| 路径 | 也就是指定图片来源为一个固定的路径,Luck-Report 默认支持以 classpath: 开头位于 classpath 下的图片文件,或以 / 开头位于 WEB 应用根下或某目录下的图片文件 |
| 表达式 | 通过表达式动态为图片指定一个路径,如:emp.select(photo),表达从数据集 emp 中取现 photo 属性值作为图片路径,这里需要注意的是,最终计算取到的值对应的图片路径,也要符合默认的以 classpath: 开头,或以 / 开头,如果需要取存储在其它位置的图片,我们可以通过实现 ImageProvider 接口实现,比如取存储在数据库中的图片等。 |
ImageProvider 接口
前面介绍了,Luck-Report 默认只支持以 classpath: 开头,或以 / 开头存储在文件系统里的文件,如果我们需要取其它位置的图片,比如取存储在数据库中的图片,可以通过实现 ImageProvider 接口实现,该接口源码如下:
package com.luck.report.core.provider.image;
import java.io.InputStream;
public interface ImageProvider {
InputStream getImage(String path);
boolean support(String path);
}在实现该接口时,我们需要为新的图片路径定义一个前缀,比如存储到数据库中我们可以以 db: 作为前缀,比如:db:001,表示存储在数据库中,ID 为 001 的图片,具体实现方式可以参照 Luck-Report 中提供的默认的支持 classpath: 和 / 前缀的 ImageProvider 实现类,默认的 DefaultImageProvider 接口实现类源码如下:
package com.luck.report.core.provider.image;
import com.luck.report.core.exception.ReportComputeException;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.util.ResourceUtils;
import org.springframework.web.context.WebApplicationContext;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class DefaultImageProvider implements ImageProvider, ApplicationContextAware {
private ApplicationContext applicationContext;
private String baseWebPath;
@Override
public InputStream getImage(String path) {
try {
if (path.startsWith(ResourceUtils.CLASSPATH_URL_PREFIX) || path.startsWith("/WEB-INF")) {
return applicationContext.getResource(path).getInputStream();
} else {
path = baseWebPath + path;
return new FileInputStream(path);
}
} catch (IOException e) {
throw new ReportComputeException(e);
}
}
@Override
public boolean support(String path) {
if (path.startsWith(ResourceUtils.CLASSPATH_URL_PREFIX)) {
return true;
} else if (baseWebPath != null && (path.startsWith("/") || path.startsWith("/WEB-INF"))) {
return true;
}
return false;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (applicationContext instanceof WebApplicationContext) {
WebApplicationContext context = (WebApplicationContext) applicationContext;
baseWebPath = context.getServletContext().getRealPath("/");
}
this.applicationContext = applicationContext;
}
}ImageProvider 接口实现类定义完成后,我们只需要将其配置到 Spring 上下文中,Luck-Report 会自动检测到并加载,这样通过自已实现 ImageProvider 接口,就可以加载任意位置的图片。