枕上从妨一夜睡,灯前读尽十年诗。这篇文章主要讲述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】按钮。
文章图片
我这里选择选择File作为数据类型,并点开Advanced options给大家看下如下,可以看到有个Maximum file size字段(也就是最大存储文件的大小),默认值为 32,768 KB,也就是 32MB,这个属性保存后不能更改,可以改大吗?答案是可以,最大可以改到 131,072 ,也就是128 MB,我这里改到131,072,然后点击右下角的【Save Table】按钮。
文章图片
然后我再打开这个Table的Main类型的表单,可以看到也是可以从左边将File类型字段拖动到表单上的,然后我保存并发布这个表单。
文章图片
现在到了看效果的时候了,如果新建的记录没有保存,会有提示:This record hasn\'t been created yet. To enable file upload, create this record 。也就是需要先保存记录才能上传附件。
文章图片
保存后,文件类型字段的提示就变了,如下:
文章图片
我这里上传一个PDF,界面就变成这样了,文件名是个超链接,点击可以下载文件,文件名字旁边多了一个【Delete】按钮。
文章图片
点击【Delete】按钮后会出来提示,确认后才会删除上传的文件。
文章图片
你可能会问,如果我这条记录只读了,这个文件字段可以单独删除值吗?这个我们看下,我将这条记录Deactivate,然后可以看到文件类型字段的值也不能修改了。
文章图片
如果字段没有值,则展示的只读效果如下:
文章图片
File类型字段不能添加作为快速查找列,也就不能用于Relevance Search.
但是可以启用审核(auditing),展示下审核file类型字段的样子,可以看到变化的是类似的guid,并不会展示文件具体内容的变化。
文章图片
那你可能会问不管什么类型的文件都能上传吗?当然是不能,这个设置那些文件后缀不能上传和注释(附件)用的是同一个,就是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 。
文章图片
我上传一个不允许的文件后缀试试,比如config文件,提示如下,并未说明明确的错误原因,当然改了设置是立即生效的。
文章图片
如果上传的文件太大呢?提示如下,也没有说具体的错误信息。
文章图片
虽然点击文件名可以下载,但是另外一个方式也可以,如果文件不超过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\'] 的表达式即可。
推荐阅读
- Dynamics 365中Customer类型字段的使用
- 使用EntityCollection类型和Entity类型的输出参数实例
- 获取用户/团队对某条记录的权限,共享某条记录的某些权限给指定用户/团队的方法
- Dynamics CRM项目实例之十(CRM 2015的捆绑销售在订单中的效果)
- 基本命令学习 -查看文件内容的六种方法
- 介绍Command Checker及重新生成Ribbon元数据的方法
- Linux内核浅入浅出
- windows server 2012R2安装RD服务并发布remoteapp应用
- 审计 Linux 系统的操作行为的 5 种方案对比