我无法在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..."
则不行。
答案 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中修复