【Power Platform系列】如何在画布应用中调用工作流上传附件

在Power Apps画布应用中上传附件,比如到SharePoint文档库最典型的方式非常简单,插入一个编辑窗体,将窗体和背后的文档库绑定起来即可以快速实现。不过窗体内部的显示格式很难控制,如果要实现更为灵活的控制,就需要采用其他方式。本文实现的是在自定义界面的画布应用中选好文件点击上传按钮调用Power Automate工作流来实现附件上传,当然也可以在Patch()里直接进行上传,示例代码如下:

Patch(YourSharePointLibrary, Defaults(YourSharePointLibrary), { Title: "New Document", YourColumnName: YourValue, // 添加其他需要的列和值},{ File: FilePicker.SelectedFile }
)

不过如果使用Power Automate可以实现更多的功能,比如将上传的文件内容通过AI识别后存储在单独的字段等则无法在Patch()里实现。

1. 构建一个简单的上传文档界面,界面如下图所示,panBulkUpload是顶层容器,下面的panNewDocument容器存储包含了上传文件的控件FileUploader(如何在画布应用里使用该控件可以参考【Power Apps系列】如何在画布应用里添加附件控件-CSDN博客)以及提示信息标签控件label1

2. 标签显示的内容为“Supported Document Type: PDF, Image; Maximal document number: 10; Allowed maximal document size: 100MB”,10和100MB来自FileUploader控件的配置,设置label1的Text属性如下即可实现

$"Supported Document Types: PDF, Image; Maximal document number: {FileUploader.MaxAttachments}; Allowed maximal document size: {FileUploader.MaxAttachmentSize}MB"

3. panBulkUpload控件的配置可以参看其代码,这里不一个个解释,留意其中的关键是garBulkUpload的Items属性设置为FileUploader.Attachments,实现了将用户上传附件的内容绑在在garBulkUpload容器

- panBulkUpload:Control: GroupContainerVariant: verticalAutoLayoutContainerProperties:DropShadow: =DropShadow.NoneFill: =RGBA(250, 250, 250, 0.8)Height: =App.HeightLayoutAlignItems: =LayoutAlignItems.StretchLayoutDirection: =LayoutDirection.VerticalLayoutJustifyContent: =LayoutJustifyContent.CenterLayoutMode: =LayoutMode.AutoWidth: =App.WidthChildren:- panNewDocument:Control: GroupContainerVariant: verticalAutoLayoutContainerProperties:AlignInContainer: =AlignInContainer.SetByContainerDropShadow: =DropShadow.BoldFill: =RGBA(255, 255, 255, 1)Height: =500LayoutAlignItems: =LayoutAlignItems.StretchLayoutDirection: =LayoutDirection.VerticalLayoutJustifyContent: =LayoutJustifyContent.SpaceBetweenLayoutMode: =LayoutMode.AutoPaddingBottom: =10PaddingLeft: =40PaddingRight: =40PaddingTop: =40Width: =800X: =(App.Width-Self.Width)/2Y: =(App.Height-Self.Height)/2Children:- Label1:Control: LabelProperties:Text: |-=$"Supported Document Types: PDF, Image; Maximal document number: {FileUploader.MaxAttachments}; Allowed maximal document size: {FileUploader.MaxAttachmentSize}MB"- FileUploader:Control: AttachmentsProperties:AddAttachmentText: ="Upload file"Items: =[]MaxAttachmentSize: =100MaxAttachments: =10MaxAttachmentsText: =""NoAttachmentsText: ="There is no file."Tooltip: ="Upload documents"BorderColor: =Color.RedBorderStyle: =BorderStyle.NoneColor: =RGBA(51, 51, 51, 1)DisabledBorderColor: =RGBA(0, 0, 0, 0)FillPortions: =1Font: =Font.'Segoe UI'Height: =240HoverColor: =RGBA(51, 51, 51, 1)HoverFill: =RGBA(212, 212, 212, 1)ItemColor: =RGBA(0, 0, 0, 1)ItemFill: =RGBA(0, 120, 212, 1)ItemHoverColor: =RGBA(51, 51, 51, 1)ItemHoverFill: =RGBA(212, 212, 212, 1)ItemSpacing: =12LayoutMinHeight: =0NoAttachmentsColor: =RGBA(166, 166, 166, 1)PaddingBottom: =5PaddingLeft: =If(Self.DisplayMode = DisplayMode.Edit, 5, 0)PaddingRight: =5PaddingTop: =5PressedFill: =RGBA(0, 120, 212, 1)Size: =10Width: =Parent.Width - 60X: =30Y: =5- garBulkUpload:Control: GalleryVariant: BrowseLayout_Horizontal_TwoTextOneImageVariant_ver5.0Properties:Items: =FileUploader.AttachmentsBorderColor: =RGBA(166, 166, 166, 1)DelayItemLoading: =trueFillPortions: =0FocusedBorderColor: =RGBA(0, 120, 212, 1)FocusedBorderThickness: =2Height: =80LoadingSpinner: =LoadingSpinner.DataTemplatePadding: =0TemplateSize: =80Visible: =falseChildren:- Title2:Control: LabelProperties:OnSelect: =Select(Parent)Text: =ThisItem.NameFontWeight: =If(ThisItem.IsSelected, FontWeight.Semibold, FontWeight.Normal)Height: =Self.Size * 1.8PaddingBottom: =0PaddingLeft: =0PaddingRight: =0PaddingTop: =0VerticalAlign: =VerticalAlign.TopWidth: =Parent.TemplateWidth - 64X: =32Y: =Image2.Y + Image2.Height + 16- Image2:Control: ImageProperties:OnSelect: =Select(Parent)Image: =ThisItem.ValueHeight: =296ImagePosition: =ImagePosition.FillRadiusBottomLeft: =8RadiusBottomRight: =8RadiusTopLeft: =8RadiusTopRight: =8Width: =Parent.TemplateWidth - 32X: =(Parent.TemplateWidth / 2) - (Self.Width / 2)Y: =16- Container4:Control: GroupContainerVariant: horizontalAutoLayoutContainerProperties:AlignInContainer: =AlignInContainer.SetByContainerDropShadow: =DropShadow.NoneFillPortions: =0Height: =50LayoutAlignItems: =LayoutAlignItems.CenterLayoutGap: =20LayoutJustifyContent: =LayoutJustifyContent.CenterLayoutMode: =LayoutMode.AutoPaddingLeft: =40PaddingRight: =40Width: =800Children:- btnSaveNewDocument:Control: Classic/ButtonProperties:OnSelect: |-=UpdateContext({varShowDocumentDetailPanel: false,varShowSpinner:true,varSpinnerMsg:"Uploading files, please wait..."});ForAll(garBulkUpload.AllItems,'UploadFiletoSharePoint'.Run(ThisRecord.Name,Substitute(JSON(Image2.Image,JSONFormat.IncludeBinaryData),"""","")));Reset(FileUploader);UpdateContext({varShowSpinner: false});Notify("Successfully",NotificationType.Success,1000)Text: ="Upload"Width: =96

4. 设置Upload按钮的OnSelect的代码如下,实现文件的上传:

// 更新上下文变量的值
UpdateContext({// 设置变量 varShowDocumentDetailPanel 为 false,隐藏文档详细信息面板varShowDocumentDetailPanel: false,// 设置变量 varShowSpinner 为 true,显示加载动画(即旋转图标)varShowSpinner: true,// 设置变量 varSpinnerMsg 为 "Uploading files, please wait...",显示加载动画时的提示信息varSpinnerMsg: "Uploading files, please wait..."}
);// 遍历集合 garBulkUpload.AllItems 中的所有记录
ForAll(garBulkUpload.AllItems, // 目标集合,包含需要上传的文件信息// 调用自定义的流 'UploadFiletoSharePoint''UploadFiletoSharePoint'.Run(// 传递当前记录的名称(ThisRecord.Name)作为参数ThisRecord.Name,// 将当前图片控件 Image2 的图像数据转换为 JSON 格式(包含二进制数据)// 并用 Substitute 函数替换掉 JSON 中的所有双引号(为了符合格式要求)Substitute(JSON(Image2.Image, // 从 Image2 控件获取图片JSONFormat.IncludeBinaryData // 指定 JSON 格式,包含二进制数据),"""", // 查找双引号"" // 替换为空字符串))
);// 重置文件上传控件 FileUploader,清空已选择的文件
Reset(FileUploader);// 上传完成后,更新上下文变量
UpdateContext({// 设置变量 varShowSpinner 为 false,隐藏加载动画varShowSpinner: false
});// 显示通知消息,提示用户操作成功
Notify("Successfully", // 通知消息内容NotificationType.Success, // 通知类型(成功)1000 // 通知显示时间(1000 毫秒,即 1 秒)
);

5. 上面步骤通过'UploadFiletoSharePoint'.Run来调用工作流,这个工作流要在画布应用里添加进来:

6. 工作流的配置如下:

7. 上方File Content的内容做了转码处理,triggerBody() 返回的是触发器的输入数据,通常以 JSON 对象的形式存在,triggerBody()?['text_1']这个表达式从触发器的主体数据中提取名为 text_1 的属性,? 操作符用于安全地访问 JSON 对象中的属性,当属性不存在时不会抛出错误,而是返回 null。dataUriToBinary()是一个 Power Automate 中的函数,用于将 Data URI(通常是以 data:image/png;base64,... 开头的字符串)转换为二进制数据,Base64 是一种将二进制数据编码为 ASCII 字符串的方法,通常用于在需要文本存储或传输二进制数据的情况下。

@{base64(dataUriToBinary(triggerBody()?['text_1']))}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/33538.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工作记录 2017-01-12

序号 工作 相关人员 1 协助BPO进行Billing的工作。 处理Amazing Charts的数据查询。 修改BillingJobPoster,处理CCDA 的自动导入,预计还需一天才能完成。 修改录入Code的界面(code 移动到指定位置),预计明天更新。…

在centOS Linux系统搭建自动化构建工具Jenkins

前言 在工作中发现公司使用Jenkins实现自动化部署项目方案,于是闲着自己也捣鼓一下,网上查阅相关部署资料,顺便记录操作步骤,所以有了下面这篇的文章。 部署完之后,安装前端项目所需环境,比如node环境&am…

开箱即用的whisper-service服务

安装须知 Whisper官方网址 https://github.com/openai/whisper Whisper 镜像站 https://docker.aityp.com/r/docker.io/onerahmet 本次提供的环境镜像为:docker.io/onerahmet/openai-whisper-asr-webservice:v1.6.0-gpu 运行环境要求 服务器架构 服务器架构要…

SpringCloud带你走进微服务的世界

认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢? 单体架构 单体架构:将业务的所有功能集中在一个项目中开发,打成一个…

【xv6操作系统】页表与写时拷贝解析及相关实验设计

【xv6操作系统】页表与写时拷贝解析及相关实验设计 页表页表概念xv6页表xv6 TLB实验1:加速系统调用实验2:打印三级页表实验3:检测已访问的页表 写时拷贝写时拷贝实验实现 页表 页表概念 deepseek说: 页表(Page Table…

如何处理PHP中的编码问题

如何处理PHP中的编码问题 在PHP开发过程中,编码问题是一个常见且棘手的问题。无论是处理用户输入、数据库交互,还是与外部API通信,编码问题都可能导致数据乱码、解析错误甚至安全漏洞。本文将深入探讨PHP中的编码问题,并提供一些…

人工智能之数学基础:线性变换的象空间和零空间

本文重点 前面的课程中,我们学习了线性变换,由此而引申出线性变换的象空间和零空间,这两个空间在机器学习领域会被经常用到,本文对此进行学习。 直观理解 总的来说象空间就是经过线性变换得到的空间,零空间就是经过线性变换是零的元素构成的空间。 从几何角度来看,象空…

方案精读:IBM方法论-IT规划方法论

该文档聚焦 IT 规划方法论,适合企业高层管理者、IT 部门负责人、业务部门主管以及参与企业信息化建设的相关人员阅读。 (本解读资料已包含在绑定资源内) 主要内容围绕 IT 规划展开:首先明确 IT 规划需基于企业核心战略&#xff0…

日志监控工具openobserve使用案例

引言 分享一个日志监控工具,openobserve(简称 o2),它是一个云原生可观察性平台,专为日志、指标、跟踪、分析 而构建,旨在以 PB 级规模运行。与 Elasticsearch 不同,OpenObserve 不需要了解和调整…

基于威胁的安全测试值得关注,RASP将大放异彩

2‍021年7月21日,由中国信息通信研究院(CAICT)指导、悬镜安全主办、腾讯安全协办的中国首届DevSecOps敏捷安全大会(DSO 2021)在北京圆满举办。大会以“安全从供应链开始”为主题,寓意安全基础决定“上层建筑…

Flutter项目升级Xcode 16.2之后编译问题

最近好久没升级Xcode了,升级了一下最新的16.2之后。发现Flutter项目在iOS设备上运行不起来了。报错: 查了许多网友也遇到了,其中一个解决方案:https://stackoverflow.com/questions/79118572/xcode-16-and-ios-18-project-not-com…

torch_geometric 安装

环境监测: import torch print(torch.__version__) # 查看pytorch安装的版本号 print(torch.cuda.is_available()) # 查看cuda是否可用。True为可用,即是gpu版本pytorch print(torch.cuda.get_device_name(0)) # 返回GPU型号 …

力扣——146.LRU缓存

题目链接: https://leetcode.cn/problems/lru-cache/solutions/259678/lruhuan-cun-ji-zhi-by-leetcode-solution/?envTypestudy-plan-v2&envIdtop-100-liked 题目描述: 思路: 提到key-value一定有map;要实现最近最少使用…

69.Harmonyos NEXT图片预览组件应用实践(二):电商、内容与办公场景

温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! Harmonyos NEXT图片预览组件应用实践(二):电商、内容与办公场景 文章目录 Harmonyos NEXT图片预览组件应用实践…

vue处理接口返回EventStream数据并进行展示

1、在 Vue 组件中连接外部 SSE 接口 HTML&#xff1a; <template><div class"ceshi-wrap"><h3 style"color:red;">来自本地文件的 SSE 流数据&#xff1a;</h3>-----<ul><li v-for"item in messages" :key&q…

Linux系统中切换CUDA版本的完整指南(含vim使用方法)

Linux系统中切换CUDA版本的完整指南&#xff08;含vim使用方法&#xff09; 在深度学习和高性能计算领域&#xff0c;经常需要在不同的CUDA版本之间切换&#xff0c;以满足不同项目的需求。本文将详细介绍如何在Linux系统中通过软链接切换CUDA版本的方法&#xff0c;并介绍了v…

批量压缩与优化 Excel 文档,减少 Excel 文档大小

当我们在 Excel 文档中插入图片资源的时候&#xff0c;如果我们插入的是原图&#xff0c;可能会导致 Excel 变得非常的大。这非常不利于我们传输或者共享。那么当我们的 Excel 文件非常大的时候&#xff0c;我们就需要对文档做一些压缩或者优化的处理。那有没有什么方法可以实现…

CentOS7安装DNS服务器bind

文章目录 安装DNS服务设置配置文件自定义域名解析完整配置 需求是公司内网服务器无法连接外网&#xff0c;需要在本地搭建DNS服务&#xff0c;这样物理机器迁移到内网后&#xff0c;通过域名解析访问服务 DNS服务器 172.25.14.215 ip域名172.25.14.216mysql.server172.25.14.2…

适合企业内训的AI工具实操培训教程(37页PPT)(文末有下载方式)

详细资料请看本解读文章的最后内容。 资料解读&#xff1a;适合企业内训的 AI 工具实操培训教程 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术迅速发展&#xff0c;深度融入到各个领域&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;更是成…

leetcode0027 移除元素 - easy

1 题目&#xff1a;移除元素 27 官方标定难度&#xff1a;简单 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k&#xf…