【问题标题】:Trigger download of file from within Dynamics CRM 2011 Plugin从 Dynamics CRM 2011 插件中触发文件下载
【发布时间】:2013-08-09 12:30:43
【问题描述】:

我在 Dynamics CRM 2011 中有一个实体,其中许可证文件以 base64 编码格式存储。

到目前为止,许可证已通过电子邮件发送给收件人(创建电子邮件活动并将文件添加为附件)。我现在还想添加直接从 Dynamics CRM 中下载文件的可能性。

CRM 2011 插件是否可以触发将文件(base64 编码的字符串)下载到客户端 Web 浏览器?

即我希望 PostLicenseUpdate 类/ExecutePostLicenseUpdate 函数开始/触发文件的下载。

A very similar 问题已通过在网络服务器上创建单独的 .aspx 来解决,但我更喜欢使用 CRM 的内置功能。

【问题讨论】:

    标签: dynamics-crm-2011


    【解决方案1】:

    这是我解决问题的方法。

    除了 jQuery,抓取 FileSaver.jsBlob.jsbase64-binary.js

    如下创建自己的download.js文件,并将addRequestDownloadLink函数添加到表单的OnLoad事件中。

    由于原始许可证数据是二进制的,因此您需要使用 Base64-binary.js 而不是 atob()。

    function addRequestDownloadLink() {
        $('#my_download').append('<div id="my_download_downloadcontainer"><a href="#" id="my_download_requestdownload">Request download of license file</a></div>');
    }
    
    $('body').on('click', '#my_download_downloadlink', function() {
        var str_decoded = Base64Binary.decode($(this).attr('data-license'));
        var blob = new Blob([str_decoded], {type: "license/binary"});
        saveAs(blob, $(this).attr('data-filename'));
    });
    
    $('body').on('click', '#my_download_requestdownload', function() {
    
        var guid = Xrm.Page.data.entity.getId();
        guid = guid.replace("{", ""); guid = guid.replace("}", "");
    
        var filename = Xrm.Page.getAttribute("my_name").getValue() + ".dat";
        var organization = Xrm.Page.context.getOrgUniqueName();
        var entity = "my_license";
        var select = "?$select=my_DataSigned"
    
        var oDataSelect = "/" + organization + "/XRMServices/2011/OrganizationData.svc/" + entity + "Set(guid'" + guid + "')" + select;
    
        $.ajax({
            type: "GET",
            contentType: "application/json; charset=utf-8",
            datatype: "json",
            url: oDataSelect,
            beforeSend: function (XMLHttpRequest) { XMLHttpRequest.setRequestHeader("Accept", "application/json"); },
            success: function (data, textStatus, XmlHttpRequest) {
                if (data.d.my_DataSigned != null) {
                    $('#my_download_downloadcontainer').html('<a href="#" id="my_download_downloadlink" data-license="' + data.d.my_DataSigned + '" data-filename="' + filename + '">Download license file!</span>');
                }
                else {
                    alert("No license found!");
                }
            },
            error: function (xmlHttpRequest, textStatus, errorThrown) {
                alert("Status: " + textStatus + "; ErrorThrown: " + errorThrown);
            }
        });
    
    });
    

    塔达啊!希望这能帮助遇到同样问题的人。

    【讨论】:

      【解决方案2】:

      我认为它不可能使用插件。你可以试试 JavaScript。

      在功能区上创建一个自定义按钮,并编辑以在按钮单击时运行 javascript 函数。使用 OData 调用检索值并写入文件。然后触发下载。看看this

      注意:如果您要使用此方法,请小心,因为 CRM 2013 中不会有任何功能区。因此,您将来可能需要对其进行调整。

      【讨论】:

      • 我担心不使用外部调用是不可能的。您提供的链接似乎是应该为我做的解决方案!
      • 你也可以试试silverlight control。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-12
      相关资源
      最近更新 更多