
# **1** **业务场景**
- 使用上传按钮上传附件时,需要在上传前后增加业务逻辑,如对上传校验权限、对上传的文件校验文件内容、上传后记录附件信息等。
- 附件面板、图片列表移除已上传的附件后,需要在移除后增加业务逻辑,如记录移除的操作信息等。
# **2** **解决方案**
在表单插件中实现kd.bos.form.control.events.UploadListener接口,具体方法有:
```java
/**
* 上传前(开始往文件服务器上传文件)
*/
default void beforeUpload(BeforeUploadEvent evt){};
/**
* 上传时(已上传文件服务器,未保存附件信息),可获取文件流
*/
default void upload(UploadEvent evt){};
/**
* 上传后(已上传文件服务器,已保存附件信息)
*/
default void afterUpload(UploadEvent evt){};
/**
* 移除时(已删除文件,未删除附件信息)
*/
default void remove(UploadEvent evt){};
/**
* 移除时(已删除文件,已删除附件信息)
*/
default void afterRemove(UploadEvent evt){};
```
# 3 示例代码
```java
public class UploadListenerTestPlugin extends AbstractFormPlugin implements UploadListener {
//注册控件监听
@Override
public void registerListener(EventObject e) {
//按钮
Button button = getControl("buttonap");
button.addUploadListener(this);
//标签
Label label = getControl("labelap");
label.addUploadListener(this);
//图片展示
Image imageControl = getControl("imageap4");
imageControl.addUploadListener(this);
//图标
Vector vectorControl = getControl("vectorap");
vectorControl.addUploadListener(this);
//图片列表
ImageList imageList = getControl("imagelistap");
imageList.addUploadListener(this);
//附件面板
AttachmentPanel attachmentPanel = getControl("attachmentpanel");
attachmentPanel.addUploadListener(this);
}
@Override
public void beforeUpload(BeforeUploadEvent evt) {
//校验上传权限,无权时取消继续上传文件
if (validatePermission()){
Map<String, Integer> param = new HashMap<>(1);
param.put("status", 0);
// 传递前端中止指令, 不继续执行文件上传
((IClientViewProxy) getView().getService(IClientViewProxy.class)).addAction("beforeUploadResult", param);
}
}
@Override
public void upload(UploadEvent evt) {
Object[] urls = evt.getUrls();
if (null != urls && urls.length > 0) {
FileService service = FileServiceFa