最近有需求是导出时就将名称设置好,用户不想再去编辑一次,嫌麻烦!!!然后就有了篇文字。。。
通过查看其它资料发现,是要进行重写getFilename方法,通过DEBUG找到了实现的一个大致路线。
在浏览器中检查元素会发现,有元素包裹了一些信息(具体头内容信息查看:https://blog.csdn.net/weixin_43453386/article/details/83792682),其中有一个为filename,这个就是我们要处理的参数。
在我使用的Birt4.6.0版本中,通过DEBUG了解了大致调用路线。有个类名为EngineFragment的类,在EngineFragment的doPreService方法中设置filename。
在工具类ParameterAccessor中:
IFilenameGenerator这个类在ParameterAccessor中的initParameters方法进行了初始化:
先通过getInitParameter方法获取web.xml中获得BIRT_FILENAME_GENERATOR_CLASS属性,判断xml中是否有配置然后对
exportFilenameGenerator实例化。
大致调用路线知道了,就开始修改。
birt 修改导出的文件名实现方法:
一、在web.xml中追加配置的 BIRT_FILENAME_GENERATOR_CLASS
<context-param>
<param-name>BIRT_FILENAME_GENERATOR_CLASS</param-name>
<param-value>
prd.birt.report.filename.TimestampFilenameGenerator
</param-value>
</context-param>
二、实现IFilenameGenerator 接口
public class CustomExportGenerator implements IFilenameGenerator {
@Override
public String getFilename( String baseName, String fileExtension, String outputType, Map options) {
String exportName = null;
Object obj = options.get(IFilenameGenerator.OPTIONS_HTTP_REQUEST);
if(obj !=null && obj instanceof RequestFacade){
RequestFacade request = (RequestFacade)obj;
// preview?&__report=Test.rptdesign&__filename=测试
//__filename可以自己定义不强求为这个名称,与路径名称一致即可
exportName = ParameterAccessor.getParameter(request,"__filename");
}
return exportName + "." + fileExtension;
}
}
getParameter为工具类ParameterAccessor中提供的方法
因为我们要的是中文文件名称,所以再修改下:
exportName = java.net.URLEncoder.encode(exportName, "UTF-8");//return前添加这行就可以了
return exportName + "." + fileExtension;
这样导出或下载文件就为自定义名称了。