如何将附件面板中上传的java文件内容展示到页面上代码编辑器控件中原创
金蝶云社区-已离职
已离职
5人赞赏了该文章 1597次浏览 未经作者许可,禁止转载编辑于2022年04月15日 18:44:27

关键词:附件面板、代码编辑器


一、需求

用户在附件面板控件中上传java/xml文件后,系统自动读取其中的内容,并显示在代码编辑器中。


二、思路与方案

1. 在设计器中将附件面板控件的“扩展名”属性设置为"java,xml"。

2. 添加一个代码编辑器控件,用于显示上传的文件内容。

3. 捕获附件面板的 afterUpload 事件,读取上传的文件内容,显示在代码编辑器控件中。


三、实现过程

1. 开发页面。

设计器界面.png


2. 用户在上传文件之后,捕获附件面板的 afterUpload 事件,读取上传文件的内容,然后显示在代码编辑器控件中。

	/**
	 * 文件上传时触发,可以在此事件接收已上传到文件服务器的文件相对URL
	 */
	@Override
	public void afterUpload(UploadEvent evt) {
		List<String> fileUrls = new ArrayList<String>();
		for (Object url : evt.getUrls()) {
			fileUrls.add((String) ((Map<String, Object>) url).get("url"));
		}
		// 从临时目录读取已上传文件内容
		for (String fileUrl : fileUrls) {
			String text = this.loadTextFileString(fileUrl);
			logger.info("读取到上传文件的内容: " + text);
			CodeEdit codeEdit = getView().getControl(KEY_CODEEDIT);
			codeEdit.setText(text);
		}
		UploadListener.super.afterUpload(evt);
	}	
	
	
	
	/**
	 * 演示读取上传的文件内容,转为文本输出
	 * @param fileUrl	已上传到临时目录的文件URL
	 * @return
	 */
	private String loadTextFileString(String fileUrl) {
		TempFileCache tempFileCache = CacheFactory.getCommonCacheFactory().getTempFileCache();
		int temp = 0;
		int len = 0;
		byte[] bt = null;
		InputStream inStream = null;
		try {
			inStream = tempFileCache.getInputStream(fileUrl);
			bt = new byte[(int) 1024 * 1024 * 5];
			while ((temp = inStream.read()) != -1) {
				bt[len] = (byte) temp;
				len++;
			}
		} catch (Exception e) {
			return e.toString();
		} finally {
			try {
				if (inStream != null) {
					inStream.close();
				}
			} catch (IOException e) {
				return e.toString();
			}
		}
		return new String(bt, 0, len);
	}


四、效果图

效果图.png


五、开发环境版本

不限


六、注意事项

1. 在附件面板中上传附件之后,首先存放在缓存中,只有在保存/提交单据之后,附件文件才会持久化到附件服务器上。

2. 附件持久化后之后,其数据信息存储在表 T_BAS_ATTACHMENT 中,对应的页面标识为 bos_attachment。

3. 附件面板控件 与 附件字段不一样!

4. 如果要在文件上传时进行业务逻辑处理,需要先监听附件面板控件的文件上传事件,如下所示。

public class AttachmentPanelDemo3 extends AbstractBillPlugIn implements UploadListener {
	
	private final static String KEY_ATTACHMENTPANEL = "attachmentpanel";
	
	@Override
	public void registerListener(EventObject e) {
		// 侦听附件面板控件的文件上传事件
		AttachmentPanel attachmentPanel = getView().getControl(KEY_ATTACHMENTPANEL);
		attachmentPanel.addUploadListener(this);
		super.registerListener(e);
	}
	
	/**
	 * 文件上传时触发,可以在此事件取消后续处理
	 */
	@Override
	public void upload(UploadEvent evt) {
		UploadListener.super.upload(evt);
	}
	
}


七、参考资料

开发平台

学习成长中心

附件面板控件

附件面板使用介绍

附件面板、附件字段支持文件重命名

自定义附件面板的按钮及修改按钮可见性

附件控件介绍(视频)

第三方系统远程上传业务单据&多个附件至苍穹系统

第三方系统远程下载苍穹系统内指定单据的所有附件

第三方系统远程查询苍穹系统内指定单据的附件信息

复制合同模板(基础资料)上的附件并填充数据后重新绑定到业务单据上

关于插件实现附件面板和附件字段的携带及转换

PC端的附件面板附件如何在移动端显示

单据附件数据在一张动态表单展示

如何实现附件面板内容从上游单据下推携带到下游单据

调用文件服务,指定上传图片路径并绑定到附件面板

控件(附件面板、附件字段、图片字段、图片控件、图片列表)介绍(视频)


赞 5