我是微软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 ,我就不一一翻译了,我捡些重点的讲解并演示下。
对于这种新类型字段,全面支持的当然是 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也是,字段名也是。
那你会问如果超过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可以看到,我这里示例请求如下:
返回的数据类似如下:
{
"@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"
}