1. 附件集成
在附件上传和下载时提供拦截机制.
- 杀毒:附件上传时结合杀毒软件厂商提供的接口,对文件进行查毒和杀毒。
- 加密:附件上传下载时使用特定的加密算法对附件进行加解密。
- 舆情监控:扫描上传附件的内容,禁止含特定关键字的附件进入系统。
- 审计日志:对附件的上传和下载行为进行记录。
1.1. 附件上传
通过监听FileUploadEvent事件可以拦截附件上传进行处理。
适用于对附件进行查毒杀毒或加密等场景。
@ListenEvent(event = FileUploadEvent.class)
public void onFileUpload(FileUploadEvent evt) throws Exception {
// 取得上传的文件
FileItem fileItem = evt.getFileItem();
// doSth
}
如果要终止上传,可以抛异常:throw new BusinessException,此时,上传被取消,前端提示错误,错误信息为异常的message。
如果要更改上传文件的内容,取得Event中的FileItem对象,调用setInputStream设置输入流,此时,保存到磁盘的文件被更改,上传成功。
如果想不终止上传,但给上传完毕要给客户端用户提示时,使用FileItem的appendMessage设置提示。
1.2. 附件下载
通过监听FileDownEvent事件可以拦截附件下载进行处理。
适用于对附件进行加密和解密等场景。
@ListenEvent(event = FileDownloadEvent.class)
public void onFileDownload(FileDownloadEvent evt) throws Exception {
// 取得下载的文件
V3XFile file = evt.getFile();
// doSth
}
1.3. 附件解密
系统中存储的附件都按设置的加密算法进行了加密,如果要手动对存储的附件进行解密,可以调用CoderFactory.getInstance().download方法(依赖seeyon\WEB-INF\lib\seeyon_ctp_core.jar),如下所示。
import com.seeyon.ctp.common.encrypt.CoderFactory;
/**
* 解密附件。
* @param input 附件文件对象
* @param output 解密后的附件
* @throws Exception
*/
public void decrypt(File input, File output) throws Exception {
FileOutputStream fop = null;
FileInputStream fin = null;
try {
fop = new FileOutputStream(output);
fin = new FileInputStream(input);
CoderFactory.getInstance().download(fin, fop);
fop.flush();
fop.close();
} catch (Exception e) {
throw e;
} finally {
try {
if (fop != null) {
fop.close();
}
if (fin != null) {
fin.close();
}
} catch (IOException e) {
}
}
}
1.4. 附件加密
第三方系统可以调用CoderFactory.getInstance().upload方法(依赖seeyon\WEB-INF\lib\seeyon_ctp_core.jar)对文件进行加密。
import com.seeyon.ctp.common.encrypt.CoderFactory;
import com.seeyon.ctp.common.encrypt.ICoder;
/**
* 加密文件。
*
* @param input
* 要加密的文件输入流
* @param output
* 加密后的文件输出流
* @param encryptVersion
* 可选值为轻度加密:ICoder.VERSON01;深度加密:ICoder.VERSON02;不加密:no
* @throws Exception
*/
public void encrypt(FileInputStream in, FileOutputStream out
,String encryptVersion) throws Exception {
CoderFactory.getInstance().upload(in, out, encryptVersion);
}
1.5. 示例
package com.seeyon.apps.test.listener;
import java.io.ByteArrayInputStream;
import javax.servlet.http.HttpServletResponse;
import com.seeyon.ctp.common.exceptions.BusinessException;
import com.seeyon.ctp.common.filemanager.event.FileDownloadEvent;
import com.seeyon.ctp.common.filemanager.event.FileItem;
import com.seeyon.ctp.common.filemanager.event.FileUploadEvent;
import com.seeyon.ctp.common.po.filemanager.V3XFile;
import com.seeyon.ctp.util.annotation.ListenEvent;
//
public class FileEventListener {
// 附件上传监听示例:杀毒
@ListenEvent(event = FileUploadEvent.class)
public void onFileUpload(FileUploadEvent evt) throws Exception {
FileItem fileItem = evt.getFileItem();
String originalFilename = fileItem.getOriginalFilename();
if (originalFilename.contains("有毒无法杀")) {
// 文件有病毒,但杀毒失败,此时抛出异常,提示用户
throw new BusinessException(originalFilename + "有病毒,无法清除");
} else if (originalFilename.contains("有毒已杀")) {
// 文件有病毒,杀毒成功,保存清除病毒后的文件,然后提示用户
fileItem.setInputStream(new ByteArrayInputStream("virus clean"
.getBytes()));
fileItem.appendMessage(originalFilename + "病毒已清除");
}
}
// 附件下载监听示例:加密
@ListenEvent(event = FileDownloadEvent.class)
public void onFileDownload(FileDownloadEvent evt) throws Exception {
V3XFile file = evt.getFile();
if(file==null){
return;
}
// 筛选要处理的文件
if("application/vnd.ms-excel".equals(file.getMimeType())){
HttpServletResponse response = evt.getResponse();
response.setContentType("application/vnd.ms-excel; charset=UTF-8");
response.setHeader("Content-disposition", "");
// 压缩或加密文件
evt.setInputStream(new ByteArrayInputStream("my file"
.getBytes()));
}
}
}