获取附件或图片的无需登录访问的URL(学习了解,不推荐实际使用)原创
金蝶云社区-JeremyG
JeremyG
9人赞赏了该文章 2,179次浏览 未经作者许可,禁止转载编辑于2022年07月15日 11:12:53
summary-icon摘要由AI智能服务提供

本文讨论了苍穹与第三方系统集成时,如何使第三方系统访问苍穹中的图片或附件。苍穹存储附件使用的是文件服务的相对路径,并通过需要登录的download.do接口访问。为简化流程,可考虑直接拼接文件服务URL和相对路径,但存在安全风险。推荐通过拼接accesstoken的方式,进行安全认证后访问附件。

背景:

在苍穹和第三方系统互相集成的情况下,经常需要把苍穹的附件或者图片等,直接让第三方系统可以访问。


分析:

  1. 查看对应的数据库表发现,对于图片或者附件等,在数据库存储的是文件服务中的相对路径。

  2. 前端拿到的URL是一个download.do的下载接口,需要登录访问,该接口会访问文件服务返回数据。

  3. 文件服务考虑安全性的问题,直接对外暴露会有风险,所以苍穹采用了分析2的访问方式。

  4. 不考虑风险的前提下,文件服务地址加上数据库的相对地址,就可以直接访问到该文件。


实现:

基于上述的分析,不考虑风险的前提下,我们可以手动拼接文件服务的URL给到第三方,这样就可以省去登录或者获取accesstoken的步骤。代码示例如下:

// 查某个页面的附件字段的数据
QFilter qFilter = new QFilter("billno", QCP.equals, "test0413-0004");
DynamicObject dynamicObject =
        BusinessDataServiceHelper.loadSingle("kdec_billdemo_0413", "id,billno,kdec_attachmentfield", new QFilter[]{qFilter});
// 附件字段,是个集合数据
DynamicObjectCollection attachmentfields = dynamicObject.getDynamicObjectCollection("kdec_attachmentfield");
// 获取索引为0的附件 DynamicObject对象
DynamicObject dynamicObject1 = attachmentfields.get(0);
// 固定写法,前面获取到的是附件的关联关系对象,需要获取fbasedataid来取到最终封装属性的附件对象(不懂就调试看数据结构)
DynamicObject attachmentfield = dynamicObject1.getDynamicObject("fbasedataid");
// 查询附件的相对路径
String url = attachmentfield.getString("url");
// 获取到的是download的前缀接口,需要登录
String property = System.getProperty("attachment.fileserver");
// 获取到的是文件服务的地址,值是在MC中配置的
String property1 = System.getProperty("attachmentServer.url");
// URL是download的前缀接口,需要登录访问
String fullURL = property+url;
// URL是文件服务的地址,可以直接访问文件
String fullURL2 = property1 + url;


拿到的fullURL2是文件服务的地址,可以直接访问。


问题:

  1. 上述这种方式需要文件服务对外暴露,并且不需要认证就可以访问,可能会泄露整个系统的附件信息,风险极大,不建议使用。

  2. 获取到download.do的接口,可以拼接accesstoken拼在url后面,就可以直接访问,推荐这种通过认证的方式访问附件。accessToken的获取方式可以搜索开放平台的相关文档。

图标赞 9
9人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!