ASP.net core 使用UEditor.Core 實現 ueditor 上傳功能

来源:https://www.cnblogs.com/WNpursue/archive/2019/02/20/ASPNetCore-use-UEditor-Core-share.html
-Advertisement-
Play Games

ASP.net core 使用UEditor.Core 實現 ueditor 上傳功能 首先通過nuget 引用UEditor.Core,作者github:https://github.com/baiyunchen/UEditor.Core/ 在Startup.cs中添加 引入ueditor並配置 ...


ASP.net core 使用UEditor.Core 實現 ueditor 上傳功能

首先通過nuget 引用UEditor.Core,作者github:https://github.com/baiyunchen/UEditor.Core/

在Startup.cs中添加

services.AddUEditorService();   


 

引入ueditor並配置

從ueditor官網下載最新版本的壓縮包,並放到項目的wwwroot下麵的lib文件夾中,然後在你需要的使用UEditor的頁面或全局引入ueditor.config.js和ueditor.all.min.js文件。

打開ueditor.config.js文件,將其中的serverUrl項改為UEditorController中Upload方法對應的地址(沒有改路由的話應該是:UEditor/Upload)。

配置靜態資源文件夾

            app.UseStaticFiles(new StaticFileOptions
            {
                FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "upload")),
                RequestPath = "/upload",
                OnPrepareResponse = ctx =>
                {
                    ctx.Context.Response.Headers.Append("Cache-Control", "public,max-age=36000");
                }
            });


解決中文被html編碼的問題

            //解決中文被html編碼的問題
            services.Configure(options =>
            {
                options.TextEncoderSettings = new TextEncoderSettings(UnicodeRanges.BasicLatin, UnicodeRanges.CjkUnifiedIdeographs);
            });


 添加後端配置文件

將下載ueditor .net 中config.js 改名 為ueditor.json添加到項目根目錄。

ueditor.json

/* 前後端通信相關的配置,註釋只允許使用多行方式 */
{
  /* 上傳圖片配置項 */
  "imageActionName": "uploadimage", /* 執行上傳圖片的action名稱 */
  "imageFieldName": "upfile", /* 提交的圖片表單名稱 */
  "imageMaxSize": 2048000, /* 上傳大小限制,單位B */
  "imageAllowFiles": [ ".png", ".jpg", ".jpeg", ".gif", ".bmp" ], /* 上傳圖片格式顯示 */
  "imageCompressEnable": true, /* 是否壓縮圖片,預設是true */
  "imageCompressBorder": 1600, /* 圖片壓縮最長邊限制 */
  "imageInsertAlign": "none", /* 插入的圖片浮動方式 */
  "imageUrlPrefix": "/", /* 圖片訪問路徑首碼 */
  "imagePathFormat": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上傳保存路徑,可以自定義保存路徑和文件名格式 */
  /* {filename} 會替換成原文件名,配置這項需要註意中文亂碼問題 */
  /* {rand:6} 會替換成隨機數,後面的數字是隨機數的位數 */
  /* {time} 會替換成時間戳 */
  /* {yyyy} 會替換成四位年份 */
  /* {yy} 會替換成兩位年份 */
  /* {mm} 會替換成兩位月份 */
  /* {dd} 會替換成兩位日期 */
  /* {hh} 會替換成兩位小時 */
  /* {ii} 會替換成兩位分鐘 */
  /* {ss} 會替換成兩位秒 */
  /* 非法字元 \ : * ? " < > | */
  /* 具請體看線上文檔: fex.baidu.com/ueditor/#use-format_upload_filename */
  /* 塗鴉圖片上傳配置項 */
  "scrawlActionName": "uploadscrawl", /* 執行上傳塗鴉的action名稱 */
  "scrawlFieldName": "upfile", /* 提交的圖片表單名稱 */
  "scrawlPathFormat": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上傳保存路徑,可以自定義保存路徑和文件名格式 */
  "scrawlMaxSize": 2048000, /* 上傳大小限制,單位B */
  "scrawlUrlPrefix": "/", /* 圖片訪問路徑首碼 */
  "scrawlInsertAlign": "none",
  /* 截圖工具上傳 */
  "snapscreenActionName": "uploadimage", /* 執行上傳截圖的action名稱 */
  "snapscreenPathFormat": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上傳保存路徑,可以自定義保存路徑和文件名格式 */
  "snapscreenUrlPrefix": "/", /* 圖片訪問路徑首碼 */
  "snapscreenInsertAlign": "none", /* 插入的圖片浮動方式 */
  /* 抓取遠程圖片配置 */
  "catcherLocalDomain": [ "127.0.0.1", "localhost", "img.baidu.com" ],
  "catcherActionName": "catchimage", /* 執行抓取遠程圖片的action名稱 */
  "catcherFieldName": "source", /* 提交的圖片列表表單名稱 */
  "catcherPathFormat": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上傳保存路徑,可以自定義保存路徑和文件名格式 */
  "catcherUrlPrefix": "/", /* 圖片訪問路徑首碼 */
  "catcherMaxSize": 2048000, /* 上傳大小限制,單位B */
  "catcherAllowFiles": [ ".png", ".jpg", ".jpeg", ".gif", ".bmp" ], /* 抓取圖片格式顯示 */
  /* 上傳視頻配置 */
  "videoActionName": "uploadvideo", /* 執行上傳視頻的action名稱 */
  "videoFieldName": "upfile", /* 提交的視頻表單名稱 */
  "videoPathFormat": "upload/video/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上傳保存路徑,可以自定義保存路徑和文件名格式 */
  "videoUrlPrefix": "/", /* 視頻訪問路徑首碼 */
  "videoMaxSize": 102400000, /* 上傳大小限制,單位B,預設100MB */
  "videoAllowFiles": [
    ".flv",
    ".swf",
    ".mkv",
    ".avi",
    ".rm",
    ".rmvb",
    ".mpeg",
    ".mpg",
    ".ogg",
    ".ogv",
    ".mov",
    ".wmv",
    ".mp4",
    ".webm",
    ".mp3",
    ".wav",
    ".mid"
  ], /* 上傳視頻格式顯示 */
  /* 上傳文件配置 */
  "fileActionName": "uploadfile", /* controller里,執行上傳視頻的action名稱 */
  "fileFieldName": "upfile", /* 提交的文件表單名稱 */
  "filePathFormat": "upload/file/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上傳保存路徑,可以自定義保存路徑和文件名格式 */
  "fileUrlPrefix": "/", /* 文件訪問路徑首碼 */
  "fileMaxSize": 51200000, /* 上傳大小限制,單位B,預設50MB */
  "fileAllowFiles": [
    ".png",
    ".jpg",
    ".jpeg",
    ".gif",
    ".bmp",
    ".flv",
    ".swf",
    ".mkv",
    ".avi",
    ".rm",
    ".rmvb",
    ".mpeg",
    ".mpg",
    ".ogg",
    ".ogv",
    ".mov",
    ".wmv",
    ".mp4",
    ".webm",
    ".mp3",
    ".wav",
    ".mid",
    ".rar",
    ".zip",
    ".tar",
    ".gz",
    ".7z",
    ".bz2",
    ".cab",
    ".iso",
    ".doc",
    ".docx",
    ".xls",
    ".xlsx",
    ".ppt",
    ".pptx",
    ".pdf",
    ".txt",
    ".md",
    ".xml"
  ], /* 上傳文件格式顯示 */
  /* 列出指定目錄下的圖片 */
  "imageManagerActionName": "listimage", /* 執行圖片管理的action名稱 */
  "imageManagerListPath": "upload/image", /* 指定要列出圖片的目錄 */
  "imageManagerListSize": 20, /* 每次列出文件數量 */
  "imageManagerUrlPrefix": "/", /* 圖片訪問路徑首碼 */
  "imageManagerInsertAlign": "none", /* 插入的圖片浮動方式 */
  "imageManagerAllowFiles": [ ".png", ".jpg", ".jpeg", ".gif", ".bmp" ], /* 列出的文件類型 */
  /* 列出指定目錄下的文件 */
  "fileManagerActionName": "listfile", /* 執行文件管理的action名稱 */
  "fileManagerListPath": "upload/file", /* 指定要列出文件的目錄 */
  "fileManagerUrlPrefix": "/", /* 文件訪問路徑首碼 */
  "fileManagerListSize": 20, /* 每次列出文件數量 */
  "fileManagerAllowFiles": [
    ".png",
    ".jpg",
    ".jpeg",
    ".gif",
    ".bmp",
    ".flv",
    ".swf",
    ".mkv",
    ".avi",
    ".rm",
    ".rmvb",
    ".mpeg",
    ".mpg",
    ".ogg",
    ".ogv",
    ".mov",
    ".wmv",
    ".mp4",
    ".webm",
    ".mp3",
    ".wav",
    ".mid",
    ".rar",
    ".zip",
    ".tar",
    ".gz",
    ".7z",
    ".bz2",
    ".cab",
    ".iso",
    ".doc",
    ".docx",
    ".xls",
    ".xlsx",
    ".ppt",
    ".pptx",
    ".pdf",
    ".txt",
    ".md",
    ".xml"
  ] /* 列出的文件類型 */
}


 

如果想上傳到根目錄特定文件夾,只需要修改

"upload/file" / "upload/image/"類似欄位即可

開始使用UEditor

 創建後端介面

 例如:

public class UEditorController : Controller
{
    private readonly UEditorService _ueditorService;
    public UEditorController(UEditorService ueditorService)
    {
        this._ueditorService = ueditorService;
    }

	//如果是API,可以按MVC的方式特別指定一下API的URI
    [HttpGet, HttpPost]   
    public ContentResult Upload()
    {
        var response = _ueditorService.UploadAndGetResponse(HttpContext);
        return Content(response.Result, response.ContentType);
    }
}


 如果想指定區域如下

using UEditor.Core;

namespace Website.MVC.Areas.Admin.Controllers
{
    [Area("Admin")]
    [Authorize]
    [IgnoreAntiforgeryToken]
    [Route("{area}/{controller}")]
    public class UploadController : Controller
    {
        private readonly UEditorService _uEditorService;
        public UploadController(UEditorService uEditorService)
        {
            _uEditorService = uEditorService;
        }
     
        [Route("UEditor")]
        [AllowAnonymous]
        [HttpGet, HttpPost]
        public ContentResult UEditor()
        {
            var response = _uEditorService.UploadAndGetResponse(HttpContext);
            return Content(response.Result, response.ContentType);
        }
    }
}


 wwwroot/lib/ueditor-1.4.3.3/ueditor.config.js中需要設置controller

        // 伺服器統一請求介面路徑
        //, serverUrl: "/ueditor/upload"
        , serverUrl: "/Admin/Upload/UEditor"


 在需要的.cshtml中添加引用

        ***
        <!--form 表單ID name 仍然可以使用-->
        <div class="layui-form-item">
            <script id="Content" name="Content" type="text/plain" style="width:1366px;height:500px;">
            </script>
        </div>
        ***
    <!-- 配置文件 -->
    <script src="~/lib/ueditor-1.4.3.3/ueditor.config.js" asp-append-version="true"></script>
    <!-- 編輯器源碼文件 -->
    <script src="~/lib/ueditor-1.4.3.3/ueditor.all.min.js" asp-append-version="true"></script>
    <!--建議手動載入語言,避免在ie下有時因為載入語言失敗導致編輯器載入失敗-->
    <!--這裡載入的語言文件會覆蓋你在配置項目里添加的語言類型,比如你在配置項目里配置的是英文,這裡載入的中文,那最後就是中文-->
    <script type="text/javascript" charset="utf-8" src="~/lib/ueditor-1.4.3.3/lang/zh-cn/zh-cn.js">



 然後在頁面的最後添加如下JS代碼:

<script type="text/javascript">
    var ue = UE.getEditor('container', {
        initialFrameHeight: 500
    });
</script>



 如果使用layui 如下:

//layer 彈窗索引
var layerindex;
var ueditContentIndex;
layui.use(['layer', 'table', 'upload', 'laydate', 'form'], function () {
    var table = layui.table,
        layer = layui.layer,
        form = layui.form,
        laydate = layui.laydate,
        upload = layui.upload;
        var useUEditor = function () {
        //建立編輯器
        ueditContentIndex = UE.getEditor('ArticleContent', {
            initialFrameHeight: 500
        });

        ****

                if (ueditContentIndex != null) {
                    ueditContentIndex.destroy();
                }

                useUEditor();       //實例化編輯器,只能放在layer 彈窗後
                // editor準備好之後才可以使用
                ueditContentIndex.addListener("ready", function () {
                    //賦值
                    ueditContentIndex.setContent(""); //你想要的值 
                });
        }

        ****
        ajax:
        $.ajax({
            type: 'post',
            url: "/Admin/Article/SubmitArticle",//請求的action路徑
            data: {
                ****
                ArticleContent: formdata.Content, //UEditor name 直接用layui formdata 省事
                *****
            },
            dataType: "json",
            success: function (data) {
                console.log(data);
            },
            error: function (data) {
                console.log(data);
                layer.msg('提交失敗!', { icon: 2 });
            }
        });   
});


 最後修複UEditor  會“吃掉” 'class', 'style' 的bug.

在 /wwwroot/lib/ueditor-1.4.3.3/ueditor.config.js 第366行

設置所有便簽都加上['class', 'style'],(有xss風險慎用)

		// xss過濾白名單 名單來源: https://raw.githubusercontent.com/leizongmin/js-xss/master/lib/default.js
		,whitList: {
			a:      ['target', 'href', 'title', 'class', 'style'],
			abbr:   ['title', 'class', 'style'],
			address: ['class', 'style'],
			area:   ['shape', 'coords', 'href', 'alt'],
            article: ['class', 'style'],
            aside: ['class', 'style'],
			audio:  ['autoplay', 'controls', 'loop', 'preload', 'src', 'class', 'style'],
			b:      ['class', 'style'],
			bdi:    ['dir'],
			bdo:    ['dir'],
            big: ['class', 'style'],
			blockquote: ['cite', 'class', 'style'],
            br: ['class', 'style'],
			caption: ['class', 'style'],
            center: ['class', 'style'],
            cite: ['class', 'style'],
			code:   ['class', 'style'],
			col:    ['align', 'valign', 'span', 'width', 'class', 'style'],
			colgroup: ['align', 'valign', 'span', 'width', 'class', 'style'],
			dd:     ['class', 'style'],
			del:    ['datetime'],
			details: ['open'],
			div:    ['class', 'style'],
			dl:     ['class', 'style'],
			dt:     ['class', 'style'],
			em:     ['class', 'style'],
			font:   ['color', 'size', 'face'],
            footer: ['class', 'style'],
			h1:     ['class', 'style'],
			h2:     ['class', 'style'],
			h3:     ['class', 'style'],
			h4:     ['class', 'style'],
			h5:     ['class', 'style'],
			h6:     ['class', 'style'],
            header: ['class', 'style'],
            hr: ['class', 'style'],
			i:      ['class', 'style'],
            img: ['src', 'alt', 'title', 'width', 'height', 'id', '_src', 'loadingclass', 'class', 'data-latex','style'],
			ins:    ['datetime'],
			li:     ['class', 'style'],
            mark: ['class', 'style'],
            nav: ['class', 'style'],
			ol:     ['class', 'style'],
			p:      ['class', 'style'],
			pre:    ['class', 'style'],
			s:      ['class', 'style'],
            section: ['class', 'style'],
            small: ['class', 'style'],
			span:   ['class', 'style'],
			sub:    ['class', 'style'],
			sup:    ['class', 'style'],
			strong: ['class', 'style'],
			table:  ['width', 'border', 'align', 'valign', 'class', 'style'],
			tbody:  ['align', 'valign', 'class', 'style'],
			td:     ['width', 'rowspan', 'colspan', 'align', 'valign', 'class', 'style'],
			tfoot:  ['align', 'valign', 'class', 'style'],
			th:     ['width', 'rowspan', 'colspan', 'align', 'valign', 'class', 'style'],
			thead:  ['align', 'valign', 'class', 'style'],
			tr:     ['rowspan', 'align', 'valign', 'class', 'style'],
            tt: ['class', 'style'],
            u: ['class', 'style'],
			ul:     ['class', 'style'],
			video:  ['autoplay', 'controls', 'loop', 'preload', 'src', 'height', 'width', 'class', 'style']
		}
    };



 UEditor.Core作者github地址: https://github.com/baiyunchen/UEditor.Core

 pass:我會經常修改 不希望被轉載!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 也許你已經覺得自己可以熟練使用python並能勝任許多開發任務,所以這篇文章是在浪費你的時間。不過彆著急,我們先從一個例子開始: 猜猜看輸出是什麼?你會說不就是0,1,1麽,真的是這樣嗎? 這是為什麼?如果你還不清楚產生錯誤的原因,那就請繼續往下閱讀吧! 本文索引 LEGB原則 名字隱藏和暫時性死區 ...
  • [toc] 函數定義 函數定義與變數定義相似, 函數示例 小結 函數用關鍵字 func 定義。 定義函數時, 函數名在前,返回類型在後 。 一個函數可以有 多個返回值 。 返回值可以指定一個名字(僅用於非常簡單的函數 )。 函數可以 作為參數 。 Go語言中函數 沒有預設參數、可選參數,函數重載 ...
  • 某些類的邏輯非常複雜,簡化代碼幫助理解下邏輯 ...
  • docker在windows下發力的時候必將取代各種虛擬機,並改變程式員的開發習慣,或許還會改變infra的工作。 概要: 在Windows下搭建開發環境一直是infra(我)頭疼的事情。為瞭解決這個問題,跟老闆,程式員商量得出的解決辦法有以下幾種:1.Mac下開發。優點是搭建環境方便,缺點是需要熟 ...
  • [toc] 條件語句 條件語句用 if 關鍵字來判定條件,如: for省略初始條件(及遞增條件), 相當於while語句 初始條件、結束條件、遞增表達式都省略是是一個死迴圈 Go中沒有while語句 ...
  • 現在好些網站都支持掃碼登錄,感覺上安全了很多,但是本地程式掃碼登錄的不多,就用C 實現了一下,需要作如下準備 1. 在官網上申請一個企業微信,有條件的話做個企業認證吧,我們的是認證過的,所以賬號和本地其他系統的賬號是統一的. 2. 在應用中創建一個應用,這個是關鍵,我們掃碼就是和它有關. 3. 點擊 ...
  • 0 綜述 1 MVP各模塊規範 1.1 實體模塊規範 1.1.1 命名規範 實體類封裝到單獨的DLL中,DLL命名遵循<ProjectName>.DataEntity。資料庫實體類名遵循:資料庫表名去掉複數尾碼,如“s”、“es”等(資料庫表的名稱必須是名詞複數)。 1.1.2 架構規範 實體模塊中 ...
  • 成功的故事固然蕩氣迴腸,失敗的故事也能千迴百轉,但是如果你連第一步都不願邁出,不去追求與償試,那麼你永完不會知道成功或者失敗的原因是什麼,人生一輩子也就三萬多天,如果每天糊裡糊塗的過去了,若幹年後可能連故事都沒得講。 年前的時候廣州.net俱樂部主席葉老師就曾微信找我私聊,說你可以在合肥組織一個合肥 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...