package com.landray.kmss.xp.util;
import com.landray.kmss.sys.attachment.model.SysAttMain;
import com.landray.kmss.sys.attachment.service.ISysAttMainCoreInnerService;
import com.landray.kmss.util.SpringBeanUtil;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
/**
* 附件相关工具类
* @author liquid
*/
public class XpAttUtil {
private static ISysAttMainCoreInnerService sysAttMainService;
public static ISysAttMainCoreInnerService getSysAttMainService() {
if (sysAttMainService == null) {
sysAttMainService = (ISysAttMainCoreInnerService)SpringBeanUtil.getBean("sysAttMainService");
}
return sysAttMainService;
}
/**
* 获取附件文件流对象
* @author liquid
* @date 2022年11月7日
* @param attId 附件ID
* @return 文件流对象
*/
public static InputStream getAttInputStream(String attId) throws Exception {
ISysAttMainCoreInnerService sysAttMainService = getSysAttMainService();
return sysAttMainService.getInputStream(attId);
}
/**
* 获取附件File对象(非直接操作附件对象)
* 若需获取附件的文件流:InputStream in = sysAttMainService.getInputStream(attId)
* @author liquid
* @date 2022年11月4日
* @param attId 附件ID
* @return 附件
*/
public static File getAttFileById(String attId) {
ISysAttMainCoreInnerService sysAttMainService = getSysAttMainService();
File tempFile = null;
byte[] buffer;
OutputStream out;
try (InputStream in = sysAttMainService.getInputStream(attId)){
// 附件信息对象
SysAttMain sysAttMain = (SysAttMain) sysAttMainService.findByPrimaryKey(attId);
String fileName = sysAttMain.getFdFileName();
buffer = new byte[in.available()];
in.read(buffer);
tempFile = File.createTempFile(fileName.substring(0, fileName.indexOf(".")), fileName.substring(fileName.lastIndexOf(".")));
out = new FileOutputStream(tempFile);
out.write(buffer);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
assert tempFile != null;
return tempFile;
}
/**
* 获取附件File对象列表(非直接操作附件对象)
* @author liquid
* @date 2022年11月4日
* @param attIdList 附件ID列表
* @return 附件文件对象列表
*/
public static List<File> getAttFilesByIdList(List<String> attIdList) {
List<File> attFileList = new ArrayList<>();
attIdList.forEach(attId -> {
attFileList.add(getAttFileById(attId));
});
return attFileList;
}
/**
* 传入模型实例Id,获取该实例下全部的附件
* @author liquid
* @date 2022年11月7日
* @param modelName 对应表单模型的全限定名;例如:
* [流程表单模型]全限定名为:KmReviewMain.class.getName()
* [低代码简单表单]全限定名为:ModelingAppSimpleMain.class.getName()
* 若不清楚对应的模型名,可查数据库表sys_att_main的fd_model_name列
* @param modelId 模型实例Id
* @return 附件文件对象列表
*/
public static List<File> getAttFilesByModelId(String modelName, String modelId) {
ISysAttMainCoreInnerService sysAttMainService = getSysAttMainService();
List<File> fileList = new ArrayList<>();
List<?> attMainList = null;
try {
attMainList = sysAttMainService.findAttListByModel(modelName, modelId);
} catch (Exception e) {
e.printStackTrace();
}
assert attMainList != null;
attMainList.parallelStream().forEach(attMain -> {
String attId = ((SysAttMain)attMain).getFdId();
System.out.println(attId);
File file = getAttFileById(attId);
fileList.add(file);
});
return fileList;
}
/**
* 获取附件下载链接列表(无权限管控)
* @author liquid
* @date 2023年3月4日
* @param attIdList 附件ID列表
* @return 下载链接列表(若传入的id对应附件不存在,则其下载链接为空串)
*/
public static List<String> getAttDownLoadUrl(List<String> attIdList) {
ISysAttMainCoreInnerService sysAttMainCoreInnerService = getSysAttMainService();
List<String> downLoadUrlList = new ArrayList<>();
for (String attId : attIdList) {
try {
String downloadUrl = sysAttMainCoreInnerService.getRestDownloadUrl(attId);
downLoadUrlList.add(downloadUrl == null ? "" : downloadUrl);
} catch (Exception e) {
System.out.println("附件不存在:" + attId);
}
}
return downLoadUrlList;
}
}
其它可能有用的信息:
ISysAttMainCoreInnerService sysAttMainService = (ISysAttMainCoreInnerService)SpringBeanUtil.getBean("sysAttMainService");
attId是附件ID(可通过联表sys_att_main和相关表查询出来,其中sys_att_main对应的模型为SysAttMain,存放系统中所有附件的信息)
1)SysAttFile attFile2 = sysAttMainService.getFile(attId);
其中fdFilePath是资源路径的相对位置(win中/为C:\landray\kmss\resource,linux中是/ekpdata)
2)SysAttMain sysAttMain = (SysAttMain) sysAttMainService.findByPrimaryKey(attId);