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()));
            }

    }    
}

results matching ""

    No results matching ""