附件面板上传文件后,获取文件服务器返回信息原创
金蝶云社区-孤勇者
孤勇者
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,第二个参数为附件面板的标识(官方源码好像是还有几个参数的,应该是为了更精确地进行查询,不过我看了一下文件服务器的文件信息,我就省略成上面的两个了。)

        如有写得不对的地方,欢迎大家指导成长。


赞 3