Dynamics 365中表的File数据类型列介绍

枕上从妨一夜睡,灯前读尽十年诗。这篇文章主要讲述Dynamics 365中表的File数据类型列介绍相关的知识,希望能为你提供帮助。
我是微软Dynamics 365 & Power Platform方面的工程师/顾问罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),欢迎关注我的微信公众号 MSFTDynamics365erLuoYong ,回复446或者20210620可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!
以前存储文件基本只有注释实体(Note实体,实体逻辑名为annotation) 或者邮件(模板)附件(显示名称为Attachment,实体逻辑名称为activitymimeattachment),可以参考我以前写的一系列文章,比如 Dynamics CRM邮件附件,你真的了解吗? ,Dynamics 365附件的常见控制 ,为Dynamics CRM注释的图片附件做个预览功能 , Dynamics 365利用HTML页面创建实体记录并同步上传附件 ,为Dynamics CRM的Office附件注释定制个无需下载即可在线查看的功能 .
大概是从V9版本开始,Dynamics 365(Microsoft DataVerse)开始提供File这种Data Type的字段了,现在不叫字段,叫列了。官方的主要介绍文档是 File columns ,我就不一一翻译了,我捡些重点的讲解并演示下。
【Dynamics 365中表的File数据类型列介绍】对于这种新类型字段,全面支持的当然是 https://make.powerapps.com/ ,而不是经典界面,所以我们登录 https://make.powerapps.com/ ,确保右上角显示的是你要操作的环境(Environment),点击左侧的Solution,打开你要增加字段的表(Table,以前叫实体),点击 【Add column】按钮。

Dynamics 365中表的File数据类型列介绍

文章图片


我这里选择选择File作为数据类型,并点开Advanced options给大家看下如下,可以看到有个Maximum file size字段(也就是最大存储文件的大小),默认值为 32,768 KB,也就是 32MB,这个属性保存后不能更改,可以改大吗?答案是可以,最大可以改到 131,072 ,也就是128 MB,我这里改到131,072,然后点击右下角的【Save Table】按钮。
Dynamics 365中表的File数据类型列介绍

文章图片


然后我再打开这个Table的Main类型的表单,可以看到也是可以从左边将File类型字段拖动到表单上的,然后我保存并发布这个表单。
Dynamics 365中表的File数据类型列介绍

文章图片


现在到了看效果的时候了,如果新建的记录没有保存,会有提示:This record hasn\'t been created yet. To enable file upload, create this record 。也就是需要先保存记录才能上传附件。
Dynamics 365中表的File数据类型列介绍

文章图片

保存后,文件类型字段的提示就变了,如下:
Dynamics 365中表的File数据类型列介绍

文章图片


我这里上传一个PDF,界面就变成这样了,文件名是个超链接,点击可以下载文件,文件名字旁边多了一个【Delete】按钮。
Dynamics 365中表的File数据类型列介绍

文章图片


点击【Delete】按钮后会出来提示,确认后才会删除上传的文件。
Dynamics 365中表的File数据类型列介绍

文章图片


你可能会问,如果我这条记录只读了,这个文件字段可以单独删除值吗?这个我们看下,我将这条记录Deactivate,然后可以看到文件类型字段的值也不能修改了。
Dynamics 365中表的File数据类型列介绍

文章图片

如果字段没有值,则展示的只读效果如下:
Dynamics 365中表的File数据类型列介绍

文章图片

File类型字段不能添加作为快速查找列,也就不能用于Relevance Search.
但是可以启用审核(auditing),展示下审核file类型字段的样子,可以看到变化的是类似的guid,并不会展示文件具体内容的变化。
Dynamics 365中表的File数据类型列介绍

文章图片


那你可能会问不管什么类型的文件都能上传吗?当然是不能,这个设置那些文件后缀不能上传和注释(附件)用的是同一个,就是System Settings中的【Set blocked file extensions for attachments】这个选项,可以看到不允许的包括:ade; adp; app; asa; ashx; asmx; asp; bas; bat; cdx; cer; chm; class; cmd; com; config; cpl; crt; csh; dll; exe; fxp; hlp; hta; htr; htw; ida; idc; idq; inf; ins; isp; its; jar; js; jse; ksh; lnk; mad; maf; mag; mam; maq; mar; mas; mat; mau; mav; maw; mda; mdb; mde; mdt; mdw; mdz; msc; msh; msh1; msh1xml; msh2; msh2xml; mshxml; msi; msp; mst; ops; pcd; pif; prf; prg; printer; pst; reg; rem; scf; scr; sct; shb; shs; shtm; shtml; soap; stm; tmp; url; vb; vbe; vbs; vsmacros; vss; vst; vsw; ws; wsc; wsf; wsh 。
Dynamics 365中表的File数据类型列介绍

文章图片


我上传一个不允许的文件后缀试试,比如config文件,提示如下,并未说明明确的错误原因,当然改了设置是立即生效的。
Dynamics 365中表的File数据类型列介绍

文章图片


如果上传的文件太大呢?提示如下,也没有说具体的错误信息。
Dynamics 365中表的File数据类型列介绍

文章图片


虽然点击文件名可以下载,但是另外一个方式也可以,如果文件不超过16MB的话,直接用类似下面的URL即可,实体名字要换成自己的,ID也是,字段名也是。
https://luoyongdemo.crm5.dynamics.com/api/data/v9.2/ly_demoentities(a3d13372-d8d1-eb11-bacc-000d3a800232)/ly_filecolumn/$value
那你会问如果超过16MB的话,还用同样的方法去请求会有问题吗,会报错类似如下:
{"error":{"code":"0x80090001","message":"Maximum file size supported for download is [16] MB. File of [20 MB] size may only be downloaded using staged chunk download."}}


如果要删除这个字段的值,可以用类似如下的代码:
var clientUrl = Xrm.Utility.getGlobalContext().getClientUrl(); var fieldName = "ly_filecolumn"; var req = new XMLHttpRequest(); req.open("DELETE", `${clientUrl}/api/data/v9.2/ly_demoentities(a3d13372-d8d1-eb11-bacc-000d3a800232)/${fieldName}`, true); req.onreadystatechange = function () { if (this.readyState == 4) { req.onreadystatechange = null; if (this.status == 204) { console.log("删除文件类型字段值成功!"); } else { var error = JSON.parse(this.responseText).error; Xrm.Navigation.openErrorDialog({ message:error.message}); } } }; req.send();


如果用Web API去查询的话,会发现多出一个隐藏列,为啥说是隐藏列,因为这个列在解决方案中看不到,但是通过Web API可以看到,我这里示例请求如下:
https://luoyongdemo.crm5.dynamics.com/api/data/v9.2/ly_demoentities(a3d13372-d8d1-eb11-bacc-000d3a800232)?$select=ly_filecolumn,ly_filecolumn_name
返回的数据类似如下:
{ "@odata.context":"https://luoyongdemo.crm5.dynamics.com/api/data/v9.2/$metadata#ly_demoentities(ly_filecolumn,ly_filecolumn_name)/$entity", "@odata.etag":"W/\\"8784978\\"", "ly_filecolumn":"becc4953-e4d1-eb11-bacc-000d3a800232", "ly_filecolumn_name":"luoyongdemo.pdf", "ly_demoentityid":"a3d13372-d8d1-eb11-bacc-000d3a800232" }


如果用来做文件存储,主要字段就是这个文件字段,想打开表单的时候就可以上传文件,我的做法就比较简单,在表单的OnLoad中加点代码,类似如下,也就是直接保存。
formOnLoad: function (executionContext) { var formContext = executionContext.getFormContext(); if (formContext.ui.getFormType() === 1) { formContext.data.save(); } }


如果我想将上传文件的文件名更新到其他字段,比如主属性 ly_name 怎么办?
我尝试了插件,但是插件中Entity这个InputParameter的中的文件字段的值是guid,并不包括文件名。而且监控字段选择不到这个文件字段。
那还有别的办法吗?我想到了用Power Automate中的Cloud Flow来处理,还真的可以。
这个flow监控文件字段的变更,然后第一步通过Micorsoft Dataverse这个Connector查询文件字段名+"_name"这个字段的值,比如是 ly_filecolumn_name这个字段。
再增加一个更新当前记录的步骤,更新的值为类似 outputs(\'Get_a_row_by_ID\')?[\'body/ly_filecolumn_name\'] 的表达式即可。

    推荐阅读