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

时间:2014-03-26 16:16:29

标签: 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,[base64data]"

这将最初作为完全有效的嵌入图像标记的内容转换为请求,从而使浏览器从服务器请求此“图像”。然后,服务器返回414 error (URI too long)

没有前置相对路径的示例:http://jsfiddle.net/GGGH/27Tbb/2/

<img src="data:image/jpeg;base64,[stuff]>

带有前置相对路径的示例(不会显示):http://jsfiddle.net/GGGH/NL85G/2/

<img src="mysite/portals/0/data:image/jpeg;base64,[stuff]>

我错过了一些配置吗? src="/somephysicalpath"可以预先设置相对路径,但src="data:image..."则不行。

1 个答案:

答案 0 :(得分:0)

我在发布问题之前最终解决了问题,但是想要将这些知识添加到SO以防其他人遇到同样的问题(还没有人注意到这个问题吗?)。此外,也许DNN或社区可以改进我的解决方案,并且该修复可以使其成为新的DNN构建。

我查看了RadEditor,RadEditorProvider的源代码,最后查看了Html模块本身的源代码。似乎问题出在EditHtml.ascx.cs,FormatContent()方法中,该方法调用HtmlTextController的ManageRelativePaths()方法。它是为所有&#34; src&#34;运行的方法。 Html内容字符串中的标签(和&#34;背景&#34;)。它对从RadEditor发出的Html字符串进行后处理,以添加该相对路径。编辑拖动到编辑器的嵌入式Base64图像时,这不合适。

为了解决这个问题,并且仍然允许制造商最初使用的标准功能,需要修改DotNetNuke.Modules.Html.EditHtm.ascx.cs,ManageRelativePaths以允许在URI包含&#34;数据:图像&#34;字符串在它的开头。第488行(自7.1.0版本起)可能是合适的。我添加了以下代码(在确定URI长度后,根据需要递增P并定位 - 我确定有更好的方法,但这样可以正常工作):

// 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)

这可能不是搜索硬编码值的最佳解决方案。更好的是允许开发人员稍后添加标签的功能。 (但是,再一次,EditHtml.ascx.cs和HtmlTextController都硬编码了他们打算后处理的两个标签。)

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

更新:已在DNN社区版本7.4.0中修复