附件面板上传文件后,获取文件服务器返回信息原创
3人赞赏了该文章
1,946次浏览
编辑于2022年01月28日 11:43:35
主要需求是在文件上传后,附件面板无法通过upload方法中获取到文件上传的信息(返回的是临时缓存的url地址,无法用于持久化操作)。
后面经过试验后,可通过重写表单的afterDoOperation方法来获取相关的信息,前提是在单据或基础资料保存信息的时候有一个操作事务校验,我这边是按钮绑定了系统自带的save操作代码(后台自动实现相关的事务操作)。
在afterDoOperation里,可以获取返回的结果 pkId,此pkId即为文件上传到文件服务器后返回数据id,可通过此id获取文件服务器中对应文件的信息,为此,参考了官方的部分源码,写了个工具类,方便后续的代码开发
。
public static Map getFileServiceMsg(Object pkId, String attachKey) { if (pkId != null) { pkId = pkId instanceof String ? pkId : "" + pkId; } if (!StringUtils.isBlank(pkId) && (!(pkId instanceof Long) || (Long)pkId != 0L)) { ORM orm = ORM.create(); QFilter[] filters = new QFilter[]{ new QFilter("finterid", "=", pkId), new QFilter("fattachmentpanel", "=", attachKey)}; DynamicObject obj = orm.queryOne("bos_attachment", filters); HashMap map = null; if (obj != null) { map = new HashMap(32); String name = (String)obj.get("FAttachmentName"); String url = null; try { url = URLEncoder.encode(String.valueOf(obj.get("FFileId")).replace("?v=1", ""), "UTF-8"); } catch (UnsupportedEncodingException var20) { logger.error(var20); } String attUrl = UrlService.getAttachmentFullUrl(url); map.put("name", name); map.put("size", Long.parseLong((String)obj.get("FATTACHMENTSIZE"))); map.put("uid", obj.get("FNUMBER")); map.put("url", attUrl); map.put("attPkId", obj.getPkValue()); map.put("entityNum", obj.get("FBILLTYPE")); map.put("billPkId", pkId); String type = (String)obj.get("FEXTNAME"); map.put("type", type); map.put("status", "success"); map.put("fattachmentpanel", attachKey); Timestamp createdate = (Timestamp)obj.get("fcreatetime"); if (createdate != null) { map.put("createdate",createdate.getTime() ); } DynamicObject creator = (DynamicObject)obj.get("FCREATEMEN"); if (creator != null) { map.put("creator",creator.get(((BasedataEntityType)creator.getDataEntityType()).getNameProperty())); } } return map; } return new HashMap(0); }
上面工具类中,主要传入两个参数 ,第一个参数为afterDoOperation中返回的pkId,第二个参数为附件面板的标识(官方源码好像是还有几个参数的,应该是为了更精确地进行查询,不过我看了一下文件服务器的文件信息,我就省略成上面的两个了。)
如有写得不对的地方,欢迎大家指导成长。
推荐阅读