本文介绍了在苍穹平台上,通过文件服务(FileService)和附件面板实现文件上传并绑定到单据作为附件的过程。包括创建单据和动态表单、编写插件代码上传图片到文件服务器、绑定文件到单据附件面板的详细步骤,以及注意事项和参考资料。特别指出,上传时需考虑文件存储路径、权限控制等问题,并提供了代码示例和操作指导。
关键词:文件服务、附件面板
一、需求
本篇文章讲述 有关于文件服务FileService以及附件的用法,为苍穹开发者提供一些代码上的参考。
整个案例由2个页面(一个单据,一个动态表单组成),单据作为存储附件文件的实体,动态表单作为上传附件的页面。
二、思路与方案
1.准备工作:创建一个带有附件面板的单据,接下来就可以把附件上传到这个单据上。
2.创建动态表单,拖入文本控件和工具栏按钮
3.编写插件代码,使用文件服务把图片上传到文件服务器
4.把文件服务器上的图片绑定为某个单据的附件
三、实现过程
1.创建单据
进入开发平台,创建单据如下,带有一个附件面板,将当前单据命名为:水果图。
2.创建动态表单
将当前动态表单命名:上传附件图片。
拖入 3个文本控件(修改控件标识为kdec_img_path、kdec_key、kdec_billno),
这三个文本的作用分别是,
kdec_img_path:让用户填入 图片的路径,kdec_key:填入单据标识,kdec_billno:填入单据编码。
拖入工具栏控件,工具栏上增加1按钮。
整体的业务逻辑是:点击按钮时,把图片路径的图片,上传到单据的附件面板上,如果没有填写单据编码,则会创建一行新单据,如果有填写单据编码,则上传到单据编码所在的附件面板上。
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.注册插件
四、效果图
复制单据的编码“kdec_fruit_img”:
生成一行新的单据数据:
进入“上传附件图片”里面,填入以下信息:
点击上传
再回到“水果图”,刷新编码为002的单据,发现附件已上传:
五、开发环境版本
六、注意事项
关于文件服务FileService有以下几点要注意
1.上传的目标目录是文件服务上配置的目录
2.文件服务上配置的目录,可以查看云苍穹目录下的 fileserver目录中的fileserver.properties文件
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中安装补丁包。
附件里的案例和本文的一些截图,在界面上略有差异,但实现方式是一致的。
code_and_meta.zip(10.70KB)
推荐阅读