背景:

去年以前可以按照目录WebResourceUtility批量上传web资源,昨天发现用不了了,拿到WebResourceUtility源码改了一下都不是很方便,感觉官方写的太冗余,太长了,跟我喜欢的简单粗暴思想不太符合,刚好无意阅览了一个上传资源的代码,干脆自己手写一个根据目录去上传web资源的工具。

工具:

LinqPad 5

Microsoft Dynamics SDK 9.0

XrmToolBox

老规矩先上效果图:

目录包含的文件

批量创建web资源后,发布

解决方案添加现有资源

代码

 //Microsoft Dynamics CRM 批量上传web资源(非官方WebResourceUtility)替换图标
//对应web资源在mscrm的文件类型
enum FileTypes
{
HTML = ,
CSS = ,
JS = ,
XML = ,
PNG = ,
JPG = ,
GIF = ,
XAP = ,
XSL = ,
ICO = ,
SVG = ,
RESX =
}
//根据目录获取目录下所有的文件
Dictionary<string, int> GetFilesWithDir(string localPath)
{
Dictionary<string, int> dict = new Dictionary<string, int>();
var typelist = Enum.GetNames(typeof(FileTypes));
var dirs = Directory.GetDirectories(localPath);
//dirs.Dump();
foreach (var dir in dirs)
{
var files = Directory.GetFiles(dir);
//files.Dump();
foreach (var file in files)
{
var index = file.LastIndexOf(".");//.Dump();
if (index == -) continue;
var filetype = file.Substring(index + ).ToUpper();
if (typelist.Contains(filetype))
{
dict.Add(file,
Enum.Parse(typeof(FileTypes), filetype).GetHashCode()
);
} }
}
return dict;
} //创建或更新web资源
Guid CreateOrUpateFile2WebResoulse(IOrganizationService service, string filePath, FileTypes type, string rootPath, string serverPath = "new_/icons/")
{
Stopwatch sw = new Stopwatch();
sw.Start(); string fileName = filePath.Replace(rootPath, serverPath).Replace("\\", "/"); var fileContent = File.ReadAllText(filePath); fileName = Regex.Replace(fileName, @"[\u4e00-\u9fa5]", "").Replace("//", "/"); //常规文本文件
var customTypes = new int[] { , , , , , }; QueryExpression query = new QueryExpression("webresource")
{
ColumnSet = new ColumnSet(new string[] { "webresourceid" }),
Criteria = new FilterExpression(LogicalOperator.And)
};
query.Criteria.AddCondition("name", ConditionOperator.Equal, new object[] { fileName });
EntityCollection entitys = service.RetrieveMultiple(query); Guid entityId; Entity entity = new Entity("webresource");
entity["content"] = customTypes.Contains(type.GetHashCode()) ? Convert.ToBase64String(Encoding.UTF8.GetBytes(fileContent.ToString())) : ImgToBase64String(filePath); if (entitys.Entities.Count == )
{
entity["webresourcetype"] = new OptionSetValue(type.GetHashCode());
entity["displayname"] = fileName;
entity["name"] = fileName;
entity["componentstate"] = new OptionSetValue();
entityId = service.Create(entity);
}
else
{
entity = entitys.Entities[];
service.Update(entity);
entityId = entity.Id;
}
sw.Stop();
Console.WriteLine($"{fileName} 创建/更新成功!耗时:{sw.ElapsedMilliseconds} 毫秒。");
return entityId;
} //发布web资源
void publishWebResources(List<Guid> ids,IOrganizationService service)
{
Stopwatch sw=new Stopwatch();
sw.Start(); var sb=new StringBuilder(); foreach (var id in ids)
{
sb.AppendLine($"\r\n<webresource>{id.ToString().ToUpper()}</webresource>\r\n");
}
XElement element = XElement.Parse("<importexportxml>\r\n<webresources>"+sb.ToString()+"</webresources>\r\n</importexportxml>");
PublishXmlRequest request = new PublishXmlRequest();
request.ParameterXml = element.ToString();
service.Execute(request);
sw.Stop();
Console.WriteLine($"批量发布!耗时:{sw.ElapsedMilliseconds} 毫秒。"); }
void Main()
{
var service = Dynamic365.GetService(Envs.dev); var rootPath = @"D:\Desktop\图标20191123\图标20191123\";
var targetPath = @"new_/dyicon/";
var dict=GetFilesWithDir(rootPath).Dump("目录包含的文件"); var ids=new List<Guid>(); foreach (var kv in dict)
{
Guid id;
try
{
id=CreateOrUpateFile2WebResoulse(service, kv.Key, (FileTypes)kv.Value, rootPath, targetPath); }
catch(Exception ex)
{
ex.Dump(); //报错重新执行一次
id=CreateOrUpateFile2WebResoulse(service, kv.Key, (FileTypes)kv.Value, rootPath, targetPath);
}
ids.Add(id);
} publishWebResources(ids,service);
}

问题延伸:

web资源批量上传后,但是还是需要手动选择web资源替换实体图标,这里在xrmtoolbox的插件市场找到iconator插件

实体修改图标最终效果图

更换站点地图底色后

移动端:

Microsoft Dynamics CRM 批量上传web资源(非官方WebResourceUtility)并替换实体图标的更多相关文章

  1. Dynamics CRM2016 升级老版本报“JavaScript Web 资源包含对 Microsoft Dynamics CRM 4.0 (2007) Web 服务终结点的引用”问题的解决办法

    今天在新的服务器上部署了CRM2016 on-premises,并将CRM2015的数据库拷贝过来准备附加后升级,但在升级过程中遇到了如下错误,向导检测到了我的JavaScript Web 资源中包含 ...

  2. Dynamics CRM2016 升级老版本号报“JavaScript Web 资源包括对 Microsoft Dynamics CRM 4.0 (2007) Web 服务终结点的引用”问题的解决的方法

    今天在新的server上部署了CRM2016 on-premises,并将CRM2015的数据库拷贝过来准备附加后升级,但在升级过程中遇到了例如以下错误.向导检測到了我的JavaScript Web ...

  3. Dynamics CRM 自定义上传附件的图片悬浮层显示

    CRM中的附件是以流的形式保存在了数据库中,这样做的一个坏处是一旦系统运行时间久,附件上传的多了势必会导致数据库极速扩大,即影响系统的运行效率也对后期的迁移维护带来了不必要的麻烦.所以很多的客户都会要 ...

  4. 一、Microsoft Dynamics CRM 4.0 SDK概述

    Chapter 1. Microsoft Dynamics CRM 4.0 SDK Overview(SDK概述) You are probably reading this book because ...

  5. WEB版一次选择多个文件进行批量上传(WebUploader)的解决方案

    本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...

  6. WEB版一次选择多个文件进行批量上传(Plupload)的解决方案

    WEB版一次选择多个文件进行批量上传(Plupload)的解决方案  转载自http://www.cnblogs.com/chillsrc/archive/2013/01/30/2883648.htm ...

  7. WEB版一次选择多个图片进行批量上传(WebUploader)的解决方案

    最近在学习百度的开源上传组件WebUploader,上一篇文章,学习了批量文件上传,今天学习一下批量图片上传,实际上与文件上传很类似,只是添加了图片显示功能,这个功能WebUploader组件中已经提 ...

  8. Microsoft Dynamics CRM 2011 当您在 大型数据集上执行 RetrieveMultiple 查询很慢的解决方法

    症状 当您在 Microsoft Dynamics CRM 2011 年大型数据集上执行 RetrieveMultiple 查询时,您会比较慢. 原因 发生此问题是因为大型数据集缓存 Retrieve ...

  9. WEB版一次选择多个文件进行批量上传(swfupload)的解决方案

    说明:功能完全支持ie和firefox浏览器! 一般的WEB方式文件上传只能使用FileUpload控件进行一个文件一个文件的进行上传,就算是批量上传,也要把文件一个一个的添加到页面,无法如windo ...

随机推荐

  1. PHP代码审计基础-中级篇

    初级篇更多是对那些已有的版本漏洞分析,存在安全问题的函数进行讲解,中级篇更多是针对用户输入对漏洞进行利用 中级篇更多是考虑由用户输入导致的安全问题. 预备工具首先要有php本地环境可以调试代码 总结就 ...

  2. cookie session token 详解

    cookie 是保存在本地终端的数据.cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器. 可以在浏 ...

  3. spark运行java-jar:Exception in thread "main" java.io.IOException: No FileSystem for scheme: hdfs

    今天碰到的一个 spark问题,困扰好久才解决 首先我的spark集群部署使用的部署包是官方提供的 spark-1.0.2-bin-hadoop2.tgz 部署在hadoop集群上. 在运行java ...

  4. Spring 框架基础(04):AOP切面编程概念,几种实现方式演示

    本文源码:GitHub·点这里 || GitEE·点这里 一.AOP基础简介 1.切面编程简介 AOP全称:Aspect Oriented Programming,面向切面编程.通过预编译方式和运行期 ...

  5. 为什么说HttpMessageConverter的顺序非常重要_SpringBoot

    问题描述 系统内配置了,ProtobufJsonFormatHttpMessageConverter和FastJsonHttpMessageConverter. Spring官方内置的默认Messag ...

  6. Linux命令比较文件内容

    文件准备 创建两个文件,分别为a.txt和b.txt,它们所含内容分别为: a.txt b.txt 1-wfhune2-chdamnsbchj3-uyr92fiubkqw5-cgvdnsb 2-djy ...

  7. Spring(四)Spring与数据库编程

    Spring最重要的功能毫无疑问就是操作数据.数据库的百年城是互联网编程的基础,Spring为开发者提供了JDBC模板模式,那就是它自身的JdbcTemplate.Spring还提供了Transact ...

  8. 一般链表实现集合运算(C语言)

    最近在学习数据结构,遇到以下问题: 假设集合A = (c, b, e, g, f, d),B = (a, b, n, f),利用一般线性链表实现集合运算(A-B)∪(B-A). 分析: 上面的问题只要 ...

  9. js原生图片懒加载 或 js原生图片预加载,html标签自定义属性

    使用原声js来实现图片预加载,或图片懒加载,小伙伴们可以根据项目需要来结合vue或者是react来进行修改. 一.什么是图片懒加载或什么是图片预加载 当访问一个页面的时候,先把img元素或是其他元素的 ...

  10. 《Effective Java》 读书笔记(八)避免使用Finalizer和Cleaner机制

    Finalizer和Cleaner并不等同于C++中的析构函数,是不确定多久会被调用的,甚至有时候可能不会被调用,因此除了作为一个安全网或者终止非关键的本地资源,不应该在Finalizer或Clean ...