微软 Power Apps MDA 模型驱动应用解决Image字段查询出来缩略图问题变原图方法(c#+Plugin方式)

news2024/9/25 19:24:57

微软 Power Apps MDA 模型驱动应用解决Image字段查询出来缩略图问题变原图方法(c#+Plugin方式)

在这里插入图片描述
在某些特定的场景中,需要将Image字段中的图片取出来,一般来说直接查询这个字段可以直接取,取出来的就是一个Base64格式的图片,但是我发现非常模糊,经了解是一个缩略图,那么如何将原图取出来的,其实微软官方文档也给出了解决方案。

链接: 微软官方文档链接入口

在这里插入图片描述

原图和缩略图的差别还是很大
在这里插入图片描述

直接贴代码

using Microsoft.Crm.Sdk.Messages;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Sdk.Query;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;

namespace testAction
{
    public class testplugin : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            var tracer = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
            var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            var serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            var service = serviceFactory.CreateOrganizationService(context.UserId);

            if (context.MessageName.Equals("update", StringComparison.OrdinalIgnoreCase))
            {
                try
                {
                    if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity target)
                    {
                        var entity = service.Retrieve("new_modeldata", target.Id,
                            new ColumnSet("new_modeldataid", "new_name", "new_fabricimagebase64", "new_onedriveimage", "new_fabricimage", "new_image_url"));

                        // 直接将文件转换成Base64字符串,确保下载的是原图
                        string base64String = ConvertFileToBase64(service, entity, "new_fabricimage");

                        // 如果需要将base64保存回CRM记录
                        entity["new_fabricimagebase64"] = base64String;
                        service.Update(entity);
                    }
                }
                catch (Exception ex)
                {
                    throw new InvalidPluginExecutionException($"Error: {ex.Message}", ex);
                }
            }
        }

        // 将文件下载并转换成Base64字符串
        public string ConvertFileToBase64(IOrganizationService service, Entity entity, string fileAttributeName)
        {
            // 使用 InitializeFileBlocksDownloadRequest 确保获取的是原图
            InitializeFileDownload(service, entity, fileAttributeName, out string downloadToken, out long fileSize, out string fileName);
            return DownloadFileAsBase64(service, entity, downloadToken, fileSize);
        }

        private void InitializeFileDownload(IOrganizationService service, Entity entity, string fileAttributeName, out string token, out long fileSize, out string fileName)
        {
            var request = new InitializeFileBlocksDownloadRequest
            {
                Target = entity.ToEntityReference(),
                FileAttributeName = fileAttributeName
            };

            var response = service.Execute(request);
            token = (string)response.Results["FileContinuationToken"];
            fileSize = (long)response.Results["FileSizeInBytes"];
            fileName = (string)response.Results["FileName"];
        }

        // 将下载的文件块拼接并转换成Base64字符串
        private string DownloadFileAsBase64(IOrganizationService service, Entity entity, string downloadToken, long fileSize)
        {
            long offset = 0;
            const long chunkSize = 4 * 1024 * 1024; // 4MB
            int chunksCount = (int)(fileSize / chunkSize) + 1;
            byte[] fileBytes = new byte[fileSize];

            for (int chunkNumber = 0; chunkNumber < chunksCount; chunkNumber++)
            {
                var downloadRequest = new DownloadBlockRequest
                {
                    FileContinuationToken = downloadToken,
                    Offset = offset,
                    BlockLength = Math.Min(chunkSize, fileSize - offset)
                };

                var response = service.Execute(downloadRequest);
                byte[] chunkData = (byte[])response.Results["Data"];
                Buffer.BlockCopy(chunkData, 0, fileBytes, (int)offset, chunkData.Length);

                offset += chunkSize;
            }

            // 将字节数组转换为Base64字符串
            return Convert.ToBase64String(fileBytes);
        }
    }
}

ConvertFileToBase64 方法:
该方法负责下载文件并将其转换成 Base64 字符串。
它调用 InitializeFileDownload 来初始化文件下载操作,获取文件的下载令牌、文件大小和文件名。

InitializeFileDownload 方法:
这是初始化文件下载的关键步骤,使用 InitializeFileBlocksDownloadRequest 请求来确保获取完整文件。
该方法返回文件的下载令牌 (FileContinuationToken)、文件大小 (FileSizeInBytes)、文件名 (FileName),这些信息随后用于实际的下载操作。

DownloadFileAsBase64 方法:
该方法负责逐块(每块 4MB)下载文件的内容,并将其拼接成一个完整的字节数组。
下载完成后,将整个字节数组转换为 Base64 字符串并返回。
其中 DownloadBlockRequest 请求用于每次下载一块数据,逐步填充 fileBytes 字节数组。

好喽,这样就可以在代码中拿到原图了!
在这里插入图片描述

感谢大佬指正 小Monkey
如果你觉得有用的话,就留个赞吧!蟹蟹

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2126067.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【linux-Day2】linux下的基本指令

【linux-Day2】linux下的基本指令 一键查看操作系统的重要地位linux下的基本指令&#x1f4e2;ls&#xff1a;显示当前目录下所有的子目录和文件&#x1f4e2;pwd&#xff1a;显示用户当前所在的目录&#xff0c;在windows中&#xff0c;相当于显示当前目录的绝对路径。&#x…

推理与训练,分布式训练

什么是推理training 在人工智能领域&#xff0c;推理是指经过训练的机器学习模型从全新的数据&#xff08;输入&#xff09;中得出结论&#xff08;输出&#xff09;的过程。通俗地讲&#xff0c;推理是模型的实际运行。 什么是训练 inference 在人工智能领域&#xff0c;训…

Linux内核初始化过程中加载TCP/IP协议栈

Linux内核初始化过程中加载TCP/IP协议栈 Linux内核初始化过程中加载TCP/IP协议栈&#xff0c;从start_kernel、kernel_init、do_initcalls、inet_init&#xff0c;找出Linux内核初始化TCP/IP的入口位置&#xff0c;即为inet_init函数。 Linux内核启动过程 之前的实验中我们设…

差值图中像素总和的正负性(极性)含义

1. 正总和的含义 当 I1 减去 I2 的差值图总和为正时&#xff0c;这意味着整体上 I1 的像素值比 I2 高。即&#xff1a; 表示&#xff1a; 2. 局部亮度变化 即便差值图的总和为正&#xff0c;也不能确保 I1 在所有区域都比 I2 亮。差值图的正总和只是表明在整个图像中&#xf…

webpack5 创建多页面应用配置

简单版webpack创建多页面应用&#xff0c;只要把配置文件复制下来&#xff0c;然后npm安装相应插件&#xff0c;正常是能跑起来了 创建 初始化 npm init生成package.json文件安装webpack npm i -D webpack webpack-cli webpack-dev-server创建main.js入口文件和webpack.config…

云计算实训48——k8s环境搭建(详细版)

1.创建主机、设置ip、设置hostname 2.设置免密登录 # 生成私钥 [rootk8s-master ~]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/id_rsa already exists. Overwrite (y/n)? y Enter passphr…

智能化转型的基石:精心策划楼宇自控系统的选择与部署

智能化转型的基石&#xff1a;精心策划楼宇自控系统的选择与部署 在智慧城市的宏伟蓝图中&#xff0c;建筑智能化已成为推动城市进步的强劲动力。楼宇自控系统&#xff0c;作为这一进程中的核心组件&#xff0c;其选择与部署策略不仅关乎建筑内部的运营效率与能源管理&#xff…

十大排序算法的特点及应用场景

一.十大经典排序算法介绍 1. 冒泡排序&#xff08;Bubble Sort&#xff09; 原理&#xff1a;通过重复遍历要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行的&#xff0c;直到没有再需要交换的元素为止。…

视频编辑SDK解决方案,完整的前端代码+SDK功能交付

繁琐的视频编辑过程往往成为创作者们提升作品质量的瓶颈&#xff0c;美摄科技凭借其深厚的AI技术积累与创新的移动端视频编辑SDK解决方案&#xff0c;正引领着视频编辑领域的新潮流&#xff0c;让每一位创作者都能轻松驾驭创意&#xff0c;实现从灵感闪现到作品呈现的无缝对接。…

点餐小程序实战教程05登录界面搭建

目录 1 设置tab栏2 添加页面3 搭建登录界面3.1 显示头像3.2 显示昵称3.3 注册按钮 总结 上一篇我们讲解了如何在首页加载的时候获取用户信息&#xff0c;一般小程序会在底部放置tab栏&#xff0c;将不同的菜单放置在tab栏中。我们的用户注册逻辑是&#xff0c;如果用户点击了底…

Java码农人生开启手册——多态与重写

一、多态 概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff1b;具体点&#xff0c;就是去完成某个行为&#xff0c;当不同的对象去完成时会产生不同的状态。 1、多态的实现条件 三个条件&#xff0c;缺一不可&#xff1a; 必须在继承体系下子类必须对父类中方…

训练 Vision Transformer 模型并运行推理

目录 CV Architecture ViT and U-Net Training ViT Florence-2 Load Model Load images CV Scenarios test Genarate CAPTION from the images DENSE REGION CAPTION and REGION_PROPOSA Caption to Phrase Grounding Bounding boxes OCR test Fine Tuning Floren…

2024年转行做网络安全工程师还来得及吗?薪资怎么样呢

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 2022年以来&#xff0c;我国网络安全行业的市场规模持续增长&#xff0c;根据市场调研在线网发布的2023-2029年中国网络安全集成行业市场运行态势及发展趋向分析…

Pycharm配置ssh远程服务器解析器

算法学习、4对1辅导、论文辅导或核心期刊可以通过公众号滴滴我 文章目录 需求配置流程 需求 之前在开发中&#xff0c;Pycharm都是通过本机Python环境来解析。但有时候&#xff0c;可能受限于本机电脑配置原因&#xff0c;导致运行速度并不快。因此推荐大家尝试下&#xff0c…

一文带你彻底掌握二分查找

1. 认识二分查找 二分查找也被称为折半查找&#xff0c;他是一种查询效率较高的查找方式&#xff0c;普通查找的方式通常是从头到尾遍历一遍数组&#xff0c;二分查找的方式是找到数组中间的那个元素mid与目标值target进行比较&#xff0c;比target小就去前半段找&#xff0c;…

Java中List集合去重

反问问题&#xff1a;为什么不直接使用 Set 或者 LinkedHashSet 呢 实际场景&#xff1a;实际的业务开发中遇到的情况会更复杂。比如&#xff0c;List 集合可能是历史遗留问题&#xff0c;也有可能是调用接口返回的类型限制&#xff0c;只能使用 List 接收&#xff0c;又或者是…

Qualcomm Linux 交叉编译应用程序

1. 前提条件 Ubuntu 20.04 系统 Qualcomm RB3 Gen2开发板 2.下载并安装 eSDK 平台 1.从 Qualcomm 发布存档平台下载 eSDK。 wget https://artifacts.codelinaro.org/artifactory/qli-ci/flashable-binaries/qimpsdk/qcm6490/x86/qcom-6.6.28-QLI.1.1-Ver.1.1_qim-product-s…

消除数字球-第15届蓝桥省赛Scratch初级组真题第5题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第184讲。 如果想持续关注Scratch蓝桥真题解读&#xff0c;可以点击《Scratch蓝桥杯历年真题》并订阅合集&#xff0c;…

python程序使用nohup后台执行不能实时输出到定向文件的解决方法

问题描述&#xff1a;使用nohup命令后台执行python&#xff0c;但python中print方法打印结果不能实时输出到nohup后台定向文件&#xff0c;只能在程序结束时一次性输出。典型问题样例&#xff1a;在python中使用了os.system(command)方法&#xff0c;command命令打印的结果可以…

免费爬虫软件“HyperlinkCollector超链采集器v0.1”

HyperlinkCollector超链采集器单机版v0.1 软件采用python的pyside2和selenium开发,暂时只支持window环境&#xff0c;抓取方式支持普通程序抓取和selenium模拟浏览器抓取。软件遵守robots协议。 首先下载后解压缩&#xff0c;然后运行app目录下的HyperlinkCollector.exe 运行…