Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

图片来源说明
路径
也就是指定图片来源为一个固定的路径,UReport2默认支持以classpath:开头位于classpath下的图片文件,或以/开头位于WEB应用根下或某目录下的图片文件
表达式通过表达式动态为图片指定一个路径,如:emp.select(photo),表达从数据集emp中取现photo属性值作为图片路径,这里需要注意的是,最终计算取到的值对应的图片路径,也要符合默认的以classpath:开头,或以/开头,如果需要取存储在其它位置的图片,我们可以通过实现ImageProvider接口实现,比如取存储在数据库中的图片等。

...

ImageProvider接口

        前面介绍了,UReport2默认只支持以classpath:开头,或以/开头存储在文件系统里的文件,如果我们需要取其它位置的图片,比如取存储在数据库中的图片,可以通过实现ImageProvider接口实现,该接口源码如下:

  

Code Block

...

title

...

ImageProvider接口源码

 

 

...

linenumberstrue
languagejava
package com.bstek.ureport.provider.image;
import java.io.InputStream;
/**
 * @author Jacky.gao
 * @since 2017年3月6日
 */
public interface ImageProvider {
	InputStream getImage(String path);
	boolean support(String path);
}

       在实现该接口时,我们需要为新的图片路径定义一个前缀,比如存储到数据库中我们可以以db:作为前缀,比如:db:001,表示存储在数据库中,ID为001的图片,具体实现方式可以参照UReport2中提供的默认的支持classpath:和/前缀的ImageProvider实现类,默认的ImageProvider接口实现类源码如下:

Code Block
titleUReport2默认的ImageProvider接口实现类源码
linenumberstrue
languagejava

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
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 com.bstek.ureport.exception.ReportComputeException;
/**
 * @author Jacky.gao
 * @since 2017年3月6日
 */
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上下文中,UReport2会自动检测到并加载,这样通过自已实现ImageProvider接口,就可以加载任意位置的图片。