在Canvas App中实现更加灵活的文件上传

Posted luoyong0201

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Canvas App中实现更加灵活的文件上传相关的知识,希望对你有一定的参考价值。

我是微软Dynamics 365 & Power Platform方面的工程师/顾问罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),这是我的第476篇原创文章,写于2022年8月16日。

附件控件的官方文档请参考 ​​Attachments control in Power Apps​​ ,可以用来上传或者下载Microsoft Lists 或者 Microsoft Dataverse table中的文件,仅仅支持Microsoft Lists 或者 Microsoft Dataverse table也是一个重要限制,而且仅仅只能用于表单控件(form)。如何扩展下能更方便灵活的上传呢?这就是今天文章要讲述的内容。

方法非本人原创,主要方法来自 ​​Shane Young​​​ 的 ​​PowerApps upload file to SharePoint document library​​​ 、 ​​PowerApps Attachment Control - Upload All Files not Images Only to Azure Blob Storage​​​ 和 ​​Power Apps Upload Multiple Files AND Drag and Drop Files​​​ 。告诉各位,如果访问不了这些教学视频,可以访问我的​​B站​​,我转载过来了。

因为Attachment控件不能直接插入,所以我先在Microsoft Dataverse中的一个表加了一个类型为 文件 的列,然后在Canvas App中的Screen插入一个Edit Form控件,数据源设置为这个表的第一条记录,然后编辑字段,将这个文件类型的列加入,这样就可以看到Attachment这个控件了。

在Canvas


然后将这个控件复制一下,

在Canvas


然后粘贴一下,因为插入的表单不用了,我们一般删除,这时候Attachment控件的有些属性的值会报错,这是因为有些属性引用了之前表单中Card的一些属性导致的,将属性的值删除即可。

在Canvas


没有文件的时候我不需要提示语言,所以我将该控件的NoAttachmentsText属性清空了,默认文本我更改成了 请选择文件上传或者将文件拖动到此处上传。

在Canvas


这里需要一个必须的辅助控件就是Image控件,将它的Image属性设置为 Last(attUpload.Attachments).Value ,当然用Last可以,用First也可以,因为Attachment控件我设置了最多上传一个控件,支持一次上传多个。另外一个Label控件,是为了让大家更好的看到这个Image控件的内容,在实际使用中是可以不用的。

在Canvas


为Attachment控件的 OnAddFile我添加了代码如下:

UpdateContext(

tempFileContent: JSON(
imgUpload.Image,
JSONFormat.IncludeBinaryData
)

);
UpdateContext(

fileContentBase64: Mid(
tempFileContent,
Find(
",",
tempFileContent
) + 1,
Len(tempFileContent) - Find(
",",
tempFileContent
) - 1
)

);

在Canvas


然后按F5快捷键我们来预览这个App并上传一个图片,可以看到展示了这个图片。

在Canvas


然后将Label控件Text属性设置为 tempFileContent ,就可以看到内容,就会更加明白前面代码的含义,第二行代码就是获取文件的base64格式内容。

在Canvas


假设我需要将这个文件上传到Sharepoint中,这时候我们需要新建一个Flow来辅助。

在Canvas


从头开始创建Flow,先声明两个文本类型的变量,用来接收传递过来的文件名称和文件的base64格式内容。这两个变量的Value都要选择 Ask in PowerApps,一般我会先修改步骤的名称后再点击 Ask in PowerApps。

在Canvas


然后使用SharePoint 这个Connector的 Create file这个Action。

在Canvas



我这里设置如下,注意File Content我用了表达式:base64ToBinary(variables(fileContentBase64)) 

在Canvas


最后添加一个 Respond to a Powerapp or flow的步骤。

在Canvas


最后我在屏幕上新增一个按钮,设置好Text后,我设置它的OnSelect属性为如下代码:

UploadfiletoSharepoint.Run(
Last(attUpload.Attachments).Name,
fileContentBase64
);
Reset(attUpload);

在Canvas


当然可以将之前展示的Label控件 lblUpload删除,Image控件imgUpload的Visible设置为false,因为不需要展示出来这个控件也可以达到目的,然后测试下:

在Canvas


可以看到文件上传到了我的Sharepoint中。

在Canvas


下面我们来美化下这个上传按钮。首先我们插入一个 Add document的图标如下。

在Canvas


然后将起Fill等填充颜色的属性设置为 Transparent ,透明的意思,边框暂时不去掉,等设置好了再去掉。然后将前面插入的Add document图标放到Attachment控件的上面,然后右击 Add document 控件,选择 Reorder > Send to back.

在Canvas


最后将Attachment控件的BorderStyle设置为None.

在Canvas


然后预览,看起来好看点了,功能也正常。

在Canvas



以上是关于在Canvas App中实现更加灵活的文件上传的主要内容,如果未能解决你的问题,请参考以下文章

在SpringMVC框架中实现文件上传和下载

JavaWeb中实现文件上传的方式有哪些?

问题:JavaWeb中实现文件上传的方式有哪些?

如何在 ASP.NET 中实现 Blueimp jQuery 文件上传

Spring中实现文件上传

前端中实现文件上传下载的三种解决方案(推荐)