C# DotNetNuke 7.1 HTML模块将数据:图像转换为URI?

C# DotNetNuke 7.1 HTML模块将数据:图像转换为URI?,c#,.net,dotnetnuke,dotnetnuke-module,C#,.net,Dotnetnuke,Dotnetnuke Module,我无法在DotNetNuke 7.1版中使用拖放功能 Telerik RadEditor的拖放功能接收浏览器的Base64输入,并将其封装在img标记中,其中源是数据。例如,src=“data:image/jpeg;base64,[base64data]” 当在HTML模块内使用拖放到RadEditor,然后保存HTML内容时,通过在DNN门户的相对路径前面加上前缀,该src定义将更改为URI请求。例如,src=“/mysite/portals/0/data:image/jpeg;base64,

我无法在DotNetNuke 7.1版中使用拖放功能

Telerik RadEditor的拖放功能接收浏览器的Base64输入,并将其封装在img标记中,其中源是数据。例如,
src=“data:image/jpeg;base64,[base64data]”

当在HTML模块内使用拖放到RadEditor,然后保存HTML内容时,通过在DNN门户的相对路径前面加上前缀,该src定义将更改为URI请求。例如,
src=“/mysite/portals/0/data:image/jpeg;base64,[base64data]”

这会将一个完全有效的嵌入图像标记转换为请求,从而导致浏览器从服务器请求该“图像”。然后服务器返回一个
414错误(URI太长)

不带前置相对路径的示例:


带有前置相对路径的示例(不会显示):



是否有一些配置我错过了?对于
src=“/somephysicalpath”
而言,预先设置相对路径是可以的,但对于
src=“data:image…”而言,则不可以。
我在发布问题之前解决了这个问题,但希望添加这些知识,以防其他人遇到同样的问题(还没有人注意到这一点吗?)。此外,也许DNN或社区可以改进我的解决方案,该修复程序可以使其成为新的DNN构建

我已经看过RadEditor、RadEditorProvider的源代码,最后是Html模块本身。问题似乎出在EditHtml.ascx.cs,FormatContent()方法中,该方法调用HtmlTextController的manageRelativePath()方法。该方法用于Html内容字符串中的所有“src”标记(和“background”)。它对RadEditor输出的Html字符串进行后期处理,以添加到该相对路径中。在编辑已拖动到编辑器的嵌入式Base64图像时,这是不合适的

为了解决此问题,并且仍然允许制造商最初打算使用的标准功能DotNetNuke.Modules.Html.EditHtm.ascx.cs,需要修改ManageRelativePath,以允许在URI开头包含“data:image”字符串时出现异常。第488行(从7.1.0版开始)可能是合适的。我添加了以下代码(适当地增加P,并在确定URI长度后定位——我相信有更好的方法,但效果很好):

这可能不是最好的解决方案,因为它搜索硬编码的值。更好的功能是允许开发人员稍后添加标记。(但是,同样,EditHtml.ascx.cs和HtmlTextController都硬编码了它们打算进行后期处理的两个标记。)

因此,在做了这个小改动之后,重新编译DotNetNuke.Modules.Html.dll并进行部署、拖放应该可以正常工作。显然,这增加了升级的复杂性——如果由DNN自己修复,效果会更好。我已验证,从v7.2.2开始,此问题仍然存在


更新:在DNN社区版本7.4.0中修复了此问题,我应该指定这适用于Firefox和Chrome。拖放根本不适用于IE。它只是在浏览器中打开拖动的文件。7.3.0版:现在位于Modules/HTML/Components/HtmlTextController,第474行。这个问题现在有点不同,但修复仍然有效。我在DNN社区源代码中修复了这个问题。它将与7.4.0版合并。
<img src="data:image/jpeg;base64,[stuff]>
<img src="mysite/portals/0/data:image/jpeg;base64,[stuff]>
// line 483, HtmlTextController.cs, DNN code included for positioning
while (P != -1)
    {
        sbBuff.Append(strHTML.Substring(S, P - S + tLen));


        // added code
        bool skipThisToken = false;
        if (strHTML.Substring(P + tLen, 10) == "data:image")  // check for base64 image
            skipThisToken = true;
        // end added code - back to standard DNN

        //keep characters left of URL
        S = P + tLen;
        //save startpos of URL
        R = strHTML.IndexOf("\"", S);
        //end of URL
        if (R >= 0)
        {
            strURL = strHTML.Substring(S, R - S).ToLower();
        }
        else
        {
            strURL = strHTML.Substring(S).ToLower();
        }

        // added code to continue while loop after the integers were updated
        if (skipThisToken)
        {
             P = strHTML.IndexOf(strToken + "=\"", S + strURL.Length + 2, StringComparison.InvariantCultureIgnoreCase);
             continue;
        }
        // end added code -- the method continues from here (not reproduced)