一、业务逻辑:
系统每天生成多张报表(帆软),但是帆软报表存在改了模板后,以往内容也同步修改,用户无法重现以前报表的问题,目前只想到两种解决办法,①修改的每一版报表模板均存档,前端根据日期调用不同的报表模板,进行展示;②将每天生成的报表结果,excel以及pdf进行ftp文件上传,存入系统服务器上,然后新增历史报表查询页面供用户进行pdf预览、打印,以及excel下载。
鉴于现在处于上线初期,用户对报表的设计和取数逻辑均存在偶尔的修改状态,且报表有30多张,为避免未来出现大量报表模板,且前端需要对应做出修改的情况,我们选择第二种实现方法。
二、操作实现:
仅用pdf版举例,excel同理。
1、在配置文件里面先配置文件上传路径,地址会自带,我们服务器是linux的。
#linux文件上传本地目录配置
XXXX.file.uploadLinuxFolder=/nfs/XXXX/XXXXXX/upload/
2、获取文件路径的方法
public static String getLocalDir(FileProperties fileProperties){
String operate = System.getProperty("os.name");
//只举例linux系统
if (operate.startsWith("Linux")) {
return fileProperties.getUploadLinuxFolder();
}
}
3、正式开始
//获取文件上传地址
String adders= FolderUtil.getLocalDir(this.fileProperties);
//引入帆软报表地址,参数为报表名、报表日期
String url = "http://XXXXXXXXXXXXXX"+URLEncoder.encode(fileName, "utf-8") +".cpt" +"&format=pdf&extype=simple"+"&date=" + reportDate;
//文件输入流
InputStream inputStream = null;
URL httpUrl = new URL(url);
conn = (HttpURLConnection) httpUrl.openConnection();
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0;Windows NT; DigExt)");
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.connect();
inputStream = conn.getInputStream(); //得到输入流
//指定文件地址和名称
String newfileName = adders+ "XXXX/pdfXXXX/" + fileName + reportDate+ ".pdf";
//文件输出流
FileOutputStream fos = new FileOutputStream(newfileName, false);
//写入
byte[] b = new byte[1024];
int length;
while ((length = inputStream.read(b)) > 0) {
fos.write(b, 0, length);
}
//关闭文件流
inputStream.close();
fos.close();
4、调用方法
XXXXExport.savePdf("生产日报", "2023-01-03", localDir);
三、讨论:
有没有更合适的方法解决这个问题~