从Dynamics CRM 2011插件中触发文件下载

时间:2013-08-09 12:30:44

标签: dynamics-crm-2011

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

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

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

即。我希望PostLicenseUpdate类/ ExecutePostLicenseUpdate函数启动/触发文件下载。

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

2 个答案:

答案 0 :(得分: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);
        }
    });

});

Tadaaa!希望这能帮助有同样问题的人。

答案 1 :(得分:0)

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

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

注意:如果您打算使用此方法,请小心,因为CRM 2013中不会有任何色带。所以将来,您可能需要调整它。