如何实现调用文件服务,指定上传图片路径并绑定到附件面板原创
金蝶云社区-吴锐雄
吴锐雄
12人赞赏了该文章 4033次浏览 未经作者许可,禁止转载编辑于2022年08月22日 10:29:37


关键词:文件服务、附件面板


一、需求

本篇文章讲述 有关于文件服务FileService以及附件的用法,为苍穹开发者提供一些代码上的参考。

整个案例由2个页面(一个单据,一个动态表单组成),单据作为存储附件文件的实体,动态表单作为上传附件的页面。


二、思路与方案

1.准备工作:创建一个带有附件面板的单据,接下来就可以把附件上传到这个单据上。

2.创建动态表单,拖入文本控件和工具栏按钮

3.编写插件代码,使用文件服务把图片上传到文件服务器

4.把文件服务器上的图片绑定为某个单据的附件


三、实现过程

1.创建单据

进入开发平台,创建单据如下,带有一个附件面板,将当前单据命名为:水果图

image.png


2.创建动态表单

image.png

将当前动态表单命名:上传附件图片


拖入 3个文本控件(修改控件标识为kdec_img_path、kdec_key、kdec_billno),

这三个文本的作用分别是,

kdec_img_path:让用户填入 图片的路径,kdec_key:填入单据标识,kdec_billno:填入单据编码。

拖入工具栏控件,工具栏上增加1按钮。


整体的业务逻辑是:点击按钮时,把图片路径的图片,上传到单据的附件面板上,如果没有填写单据编码,则会创建一行新单据,如果有填写单据编码,则上传到单据编码所在的附件面板上。


image.png


3.编写插件代码

从一个 路径文本控件 中获取到文件路径,并解析出文件名。

利用文件路径生成 文件输入流。

String[] strPath = filePath.split("/");

// 文件名
String fileName = strPath[strPath.length - 1];
// 上传路径:相对路径+文件名
String uploadPath = "image/" + fileName;
// 本地文件构造一个 文件输入流,我是window操作系统,获取到了C盘下的一个jpg图片
File file = new File(filePath);

FileInputStream fileInputStream = null;
try {
    fileInputStream = new FileInputStream(file);
} catch (FileNotFoundException e) {
    throw new KDException("未在找到本地磁盘中找到该文件,无法上传");
}


4.使用文件服务把图片上传到文件服务器

FileService fs = FileServiceFactory.getAttachmentFileService();
// 构造FileItem
FileItem fi = new FileItem(fileName, uploadPath, fileInputStream);
try {
    // 上传,并获取到上传之后的相对路径
    String path = fs.upload(fi);
    System.out.println("上传成功:" + path);
    getView().showSuccessNotification("上传成功");
} catch (Exception e) {
    throw new KDException("上传失败");
}


5.把上传的文件,绑定给当前单据的附件面板

Map uploadFileMap = new HashMap();
uploadFileMap.put("entityNum", "wjkd_upload_attach");
uploadFileMap.put("billPkId", pkid.toString());
uploadFileMap.put("lastModified", new Date().getTime());

uploadFileMap.put("name", fileName);
uploadFileMap.put("url", uploadPath);
uploadFileMap.put("size", file.length());
uploadFileMap.put("status", "success");

List<Map<String, Object>> attachments = new ArrayList<>();
attachments.add(uploadFileMap);

AttachmentServiceHelper.upload("wjkd_upload_attach", pkid, "wjkd_attachmentpanelap", attachments);
this.getView().updateView("wjkd_attachmentpanelap");


6.注册插件

image.png



四、效果图

复制单据的编码“kdec_fruit_img”:

image.png

生成一行新的单据数据:

image.png

进入“上传附件图片”里面,填入以下信息:

image.png


点击上传

image.png


再回到“水果图”,刷新编码为002的单据,发现附件已上传:

image.png




五、开发环境版本

image.png


六、注意事项

关于文件服务FileService有以下几点要注意

1.上传的目标目录是文件服务上配置的目录


2.文件服务上配置的目录,可以查看云苍穹目录下的 fileserver目录中的fileserver.properties文件

image.png

image.png

3.配置上传路径时,也需要把文件名和扩展名加上,例如代码中的实例


4.上传的目录如果不存在,会默认自动创建


5.上传时,需要特别注意 操作系统的文件系统权限管控问题,不同版本的centos有不同的权限管控,或者系统管理员对上传目录进行严格的权限管控,可能会导致文件上传失败。


6.上传成功之后,可以使用路径path访问浏览对应的文件:

浏览对应的文件,例如:http://IP地址:PORT端口号/ierp/attachment/preview.do?path=/image/XXX.jpg

下载对应的文件:http://IP地址:PORT端口号/ierp/attachment/download.do?path=/image/XXX.jpg

注意,这个路径 path=/image/XXX.jpg,是第三节第2小节“编写插件代码”中,代码里写的 上传路径。


7.上传成功之后,可以在fileserver.properties对应的目录中查找到这个文件


关于附件有以下几点要注意

1.如果想让附件控件在新增时就显示附件,建议在afterBindData中处理。

2.如果单据处于新增状态(还未保存),那么附件控件只能绑定已上传的附件,例如绑定其他单据的附件。

3.只有保存过,生成了pkid的单据,才可以把文件服务器上的文件绑定到 附件面板上。

4.用DB.genGlobalLongId(),生成一个id,把id设置给单据的数据模型model, 例如:getModel("id", id),也可以达到想要的效果。


七、参考资料

【开发平台】指导手册

学习成长中心

附件面板



八、附件

附件包含补丁包和java源代码。

补丁包包含jar包和元数据包,请在mc中安装补丁包。

附件里的案例和本文的一些截图,在界面上略有差异,但实现方式是一致的。




赞 12