UEditor采坑指南


1.版本選擇

GitHub上的最新版(1.5)沒有提供后端代碼。想要后端代碼可以下載歷史版本(1.4.3.3)。

1.5版本:https://github.com/fex-team/ueditor

1.4.3.3版本:https://github.com/fex-team/ueditor/releases/tag/v1.4.3.3

2.部署

(原文:https://xoyozo.net/Blog/Details/how-to-config-ueditor-with-asp-net)

客戶端部署

本例將上述所有目錄和文件拷貝到網站目錄 /libs/ueditor/ 下。

當然也可以引用 CDN 靜態資源,但會遇到諸多跨域問題,不建議。

在內容編輯頁面引入:

<script src="/libs/ueditor/ueditor.config.js"></script>
<script src="/libs/ueditor/ueditor.all.min.js"></script>

在內容顯示頁面引入:

<script src="/libs/ueditor/ueditor.parse.min.js"></script>

如需修改編輯器資源文件根路徑,參 ueditor.config.js 文件內頂部文件。(一般不需要單獨設置)

如果使用 CDN,那么在初始化 UE 實例的時候應配置 serverUrl 值(即 controller.ashx 所在路徑)。

 

初始化 UE 實例:

var ue = UE.getEditor('tb_content', {
    // serverUrl: '/libs/ueditor/net/controller.ashx', // 指定服務端接收文件路徑
    initialFrameWidth: '100%'
});

其它參數見官方文檔,或 ueditor.config.js 文件。

 

服務端部署

net 目錄是 ASP.NET 版的服務端程序,用來實現接收上傳的文件等功能。

本例中在網站中的位置是 /libs/ueditor/net/。如果改動了位置,那么在初始化 UE 的時候也應該配置 serverUrl 值。

這是一個完整的 VS 項目,可以單獨部署為一個網站。其中:

net/config.json  服務端配置文件
net/controller.ashx  文件上傳入口
net/App_Code/CrawlerHandler.cs  遠程抓圖動作
net/App_Code/ListFileManager.cs  文件管理動作
net/App_Code/UploadHandler.cs  上傳動作

該目錄不需要轉換為應用程序。

 

服務端配置

根據 config.json 中 *PathFormat 的默認配置,一般地,上傳的圖片會保存在 controller.ashx 文件所在目錄(即本例中的 /libs/ueditor/)的 upload 目錄中:
/libs/ueditor/upload/image/
原因是 UploadHandler.cs 中 Server.MapPath 的參數是由 *PathFormat 決定的。

以修改 config.json 中的 imagePathFormat 為例:

原值:"imagePathFormat": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}"

改為:"imagePathFormat": "/upload/ueditor/image/{yyyy}{mm}{dd}/{time}{rand:6}"

以“/”開始的路徑在 Server.MapPath 時會定位到網站根目錄。

此處不能以“~/”開始,因為最終在客戶端顯示的圖片路徑是 imageUrlPrefix + imagePathFormat,若其中包含符號“~”就無法正確顯示。

在該配置文件中查找所有 PathFormat,按相同的規則修改。

 

說到客戶端的圖片路徑,我們只要將

原值:"imageUrlPrefix": "/ueditor/net/"

改為:"imageUrlPrefix": ""

即可返回客戶端正確的 URL。

當然也要同步修改 scrawlUrlPrefix、snapscreenUrlPrefix、catcherUrlPrefix、videoUrlPrefix、fileUrlPrefix。

 

特殊情況,在復制包含圖片的網頁內容的操作中,若圖片地址帶“?”等符號,會出現無法保存到磁盤的情況,需要修改以下代碼:

打開  CrawlerHandler.cs 文件,找到

ServerUrl = PathFormatter.Format(Path.GetFileName(this.SourceUrl), Config.GetString("catcherPathFormat"));

替換成:

ServerUrl = PathFormatter.Format(Path.GetFileName(SourceUrl.Contains("?") ? SourceUrl.Substring(0, SourceUrl.IndexOf("?")) : SourceUrl), Config.GetString("catcherPathFormat"));

 

如果你將圖片保存到第三方圖庫,那么 imageUrlPrefix 值設為相應的域名即可,如:

改為:"imageUrlPrefix": "//cdn.***.com"

然后在 UploadHandler.cs 文件(用於文件上傳)中找到

File.WriteAllBytes(localPath, uploadFileBytes);

在其下方插入上傳到第三方圖庫的代碼,以阿里雲 OSS 為例:

// 上傳到 OSS
client.PutObject(bucketName, savePath.Substring(1), localPath);

在 CrawlerHandler.cs 文件(無程抓圖上傳)中找到

File.WriteAllBytes(savePath, bytes);

在其下方插入上傳到第三方圖庫的代碼,以阿里雲 OSS 為例:

// 上傳到 OSS
client.PutObject(bucketName, ServerUrl.Substring(1), savePath);

 

最后有還有兩個以 UrlPrefix 結尾的參數名 imageManagerUrlPrefix 和 fileManagerUrlPrefix 分別是用來列出上傳目錄中的圖片和文件的,

對應的操作是在編輯器上的“多圖上傳”功能的“在線管理”,和“附件”功能的“在線附件”。

最終列出的圖片路徑是由 imageManagerUrlPrefix + imageManagerListPath + 圖片 URL 組成的,那么:

"imageManagerListPath": "/upload/ueditor/image",
"imageManagerUrlPrefix": "",

以及:

"fileManagerListPath": "/upload/ueditor/file",
"fileManagerUrlPrefix": "",

即可。

如果是上傳到第三方圖庫的,且圖庫上的文件與本地副本是一致的,那么將 imageManagerUrlPrefix 和 fileManagerUrlPrefix 設置為圖庫域名,

服務端仍然以 imageManagerListPath 指定的路徑來查找本地文件(非圖庫),但客戶端顯示圖庫的文件 URL。

因此,如果文件僅存放在圖庫上,本地沒有副本的情況就無法使用該功能了。

綜上,所有的 *UrlPrefix 應該設為一致。

 

另外記得配置不希望被遠程抓圖的域名,參數 catcherLocalDomain。

 

服務端授權

現在來判斷一下只有登錄用戶才允許上傳。

首先打開服務端的統一入口文件 controller.ashx,

繼承類“IHttpHandler”改為“IHttpHandler, System.Web.SessionState.IRequiresSessionState”,即同時繼承兩個類,以便可使用 Session,
找到“switch”,其上插入:

if (用戶未登錄) { throw new System.Exception("請登錄后再試"); }

即用戶已登錄或 action 為獲取 config 才進入 switch。然后,

else
{
    action = new NotAllowedHandler(context);
}

這里的 NotAllowedHandler 是參照 NotSupportedHandler 創建的,提示語 state 可以是“登錄后才能進行此操作。”

 

上傳目錄權限設置

上傳目錄(即本例中的 /upload/ueditor/ 目錄)應設置允許寫入和禁止執行。

 

基本用法

設置內容:

ue.setContent("Hello world.");

獲取內容:

var a = ue.getContent();

更多用法見官方文檔:http://fex.baidu.com/ueditor/#api-common

 

其它事宜

配置上傳附件的文件格式

找到文件:config.json,更改“上傳文件配置”的 fileAllowFiles 項,

同時在 Web 服務器上允許這些格式的文件可訪問權限。以 IIS 為例,在“MIME 類型”模塊中添加擴展名。


遇到從客戶端(......)中檢測到有潛在危險的 Request.Form 值。參考此文


另外,對於不支持上傳 .webp 類型的圖片的問題,可以作以下修改:
config.json 中搜索“".bmp"”,替換為“".bmp", ".webp"”
IIS 中選中對應網站或直接選中服務器名,打開“MIME 類型”,添加,文件擴展名為“.webp”,MIME 類型為“image/webp”


最后,為了在內容展示頁面看到跟編輯器中相同的效果,請參照官方文檔引用 uParse

若有插入代碼,再引用:

<link href="/lib/ueditor/utf8-net/third-party/SyntaxHighlighter/shCoreDefault.css" rel="stylesheet" />
<script src="/lib/ueditor/utf8-net/third-party/SyntaxHighlighter/shCore.js"></script>

其它插件雷同。


若對編輯器的尺寸有要求,在初始化時設置即可:

var ue = UE.getEditor('tb_content', {
  initialFrameWidth: '100%',
  initialFrameHeight: 320
});

 

3.解決無法插入動態地圖

(原文:https://www.cnblogs.com/CcPz/p/10012122.html)

(1)打開編輯器根目錄下面的ueditor.all.js文件,找到:

table.setAttribute("data-sort", cmd == "enablesort" ? "sortEnabled" : "sortDisabled")

在這句代碼下面加一行:

table.setAttribute("style", "border-collapse:collapse;");

(2)在ueditor.all.js文件中找到:

return '<table><tbody>' + html.join('') + '</tbody></table>'

改為:

return '<table style="border-collapse:collapse;"><tbody>' + html.join('') + '</tbody></table>'

(3)修改配置文件ueditor.config.js 找到:

whitList

下一行添加:

iframe: ['frameborder','border','marginwidth','marginheight','width','height','src','id'],//動態地圖

 

4.解決單獨調用上傳圖片失效問題

(原文:https://www.cnblogs.com/pcx105/p/7717028.html)

第一步, 引入文件

<script src="jquery.min.js" type="text/javascript" ></script>
<script src="ueditor/ueditor.config.js" type="text/javascript" ></script>
<script src="ueditor/ueditor.all.min.js" type="text/javascript" ></script>

第二步 html元素

<script type="text/plain" id="upload_ue"></script>

調用的頁面:

<input type="text" id="picture" name="cover" /><a href="javascript:void(0);" onclick="upImage();">上傳圖片</a>
<input type="text" id="file" /><a href="javascript:void(0);" onclick="upFiles();">上傳文件</a>

第三步 編寫js代碼

<script type="text/javascript">
var _editor;
$(function() {

//重新實例化一個編輯器,防止在上面的editor編輯器中顯示上傳的圖片或者文件
_editor = UE.getEditor('upload_ue');
_editor.ready(function () {
//設置編輯器不可用
_editor.setDisabled();
//隱藏編輯器,因為不會用到這個編輯器實例,所以要隱藏
_editor.hide();
//偵聽圖片上傳
_editor.addListener('beforeInsertImage', function (t, arg) {
//將地址賦值給相應的input,只去第一張圖片的路徑
$("#picture").attr("value", arg[0].src);
//圖片預覽
$("#preview").attr("src", arg[0].src);
})
//偵聽文件上傳,取上傳文件列表中第一個上傳的文件的路徑
_editor.addListener('afterUpfile', function (t, arg) {
$("#file").attr("value", _editor.options.filePath + arg[0].url);
})
});
}); 
//彈出圖片上傳的對話框
function upImage() {
var myImage = _editor.getDialog("insertimage");
myImage.open();
}
//彈出文件上傳的對話框
function upFiles() {
var myFiles = _editor.getDialog("attachment");
myFiles.open();
}
</script>

第四步 最重要的一步, 修改bug

打開image插件的image.js 108行

editor.execCommand('insertimage', list);

代碼之前加入

editor.fireEvent('beforeinsertimage', list);

然后問題搞定

第五步,如果第四步不行,請參考這一步

在ueditor文件夾中找到文件dialogs\attachment\attachment.js中找到代碼

editor.execCommand('insertfile', list);

在這行代碼前添加

editor.fireEvent('afterUpfile', list);

然后問題搞定

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM