CKEditor上传插件

12 篇文章 0 订阅
7 篇文章 0 订阅

CKEditor上传插件


前言


CKEditor的上传插件不是免费的,特此开发一个与大家共享。此插件是基于ASP.NET MVC下开发的,如果是webform的用户或者其它语言的用户,可以参考把服务器端做相应的修改。看图:



大家可以看到Browse Button和Upload选项卡。下面分步详解三部分的实现:浏览服务器端图片或文件,上传图片或文件,CKEditor配置。


浏览服务器端图片或文件


先上图:



做了一个十分简易的浏览页面,左半部分是文件夹树,右半部分则显示当前文件夹中的图片。

ASP.NET MVC中Controller中浏览页面的action代码如下(即页面对应的服务器端代码):

public ActionResult Browse()
        {
            var type = Request.QueryString["Type"];
            var isImage = !string.IsNullOrEmpty(type) && type.Equals("Images", StringComparison.InvariantCultureIgnoreCase);
            ViewBag.IsImg = isImage;
            return View();
        }

不是ASP.NET MVC的用户,就把它当成是页面加载。
View(即页面代码)代码如下:

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Browse</title>
    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/modernizr")
    <link href="/SHTracker/Scripts/TreeView/jquery.treeview.css" rel="stylesheet" type="text/css" />
    <link href="/SHTracker/Scripts/TreeView/screen.css" rel="stylesheet" type="text/css" />
    <script src="/SHTracker/Scripts/TreeView/jquery.treeview.pack.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            $("body>aside>ul").treeview({
                animated: true,
                persist: "location",
                collapsed: true,
                unique: false
            });
        });
    </script>
    <style type="text/css">
        aside{ border: solid 3px #006400;float: left;width: 20%;height: 100%;padding: 5px;}
        section{ float: right;padding: 5px;margin-left: 10px;border: solid 3px #008b8b;width: 70%;height: 100%;}
        section ul li{ float: left;padding: 10px;list-style-type: none;}
        img{ z-index: 999;cursor: pointer;}
    </style>
</head>
<body>
    <aside>
        <ul>
            <li>Home</li>
            <ul>
                @if ((bool) ViewBag.IsImg)
                {
                    <li>Images
                        <ul>
                            @foreach (var dir in Directory.GetDirectories(Server.MapPath("/Images")))
                            {

                                <li><a href="@ICStars2_0.Common.UrlHelper.SafeAddQueryToURL("folderpath", Url.Encode(dir.Replace(Server.MapPath("/"), "")), Request.RawUrl)">@Path.GetFileName(dir)</a></li>
                            }
                        </ul>
                    </li>
                }
                else
                {
                    <li>Docs
                        <ul>
                            @foreach (var dir in Directory.GetDirectories(Server.MapPath("/Docs")))
                            {
                                <li><a href="@ICStars2_0.Common.UrlHelper.SafeAddQueryToURL("folderpath", Url.Encode(dir.Replace(Server.MapPath("/"), "")), Request.RawUrl)">@Path.GetFileName(dir)</a></li>
                            }
                        </ul>
                    </li>
                }
            </ul>
        </ul>
    </aside>
    <section>
        @if (!string.IsNullOrEmpty(Request.QueryString["folderpath"]))
        {
            <ul>
                @{ var imgTypes = new[] {".jpg", ".gif", ".png"}; }
                @foreach (var file in Directory.GetFiles(Server.MapPath("/" + Request.QueryString["folderpath"])))
                {
                    if ((bool) ViewBag.IsImg && imgTypes.Contains(Path.GetExtension(file.ToLower())))
                    {

                        <li><img src="/@Request.QueryString["folderpath"].Replace("\\", "/")/@Path.GetFileName(file)" width="100" οnclick=" window.opener.CKEDITOR.tools.callFunction(@Request.QueryString["CKEditorFuncNum"], this.src);window.close(); "/></li>

                    }
                    else
                    {
                        <li><a href="javascript:" οnclick=" window.opener.CKEDITOR.tools.callFunction(@Request.QueryString["CKEditorFuncNum"], '/@Request.QueryString["folderpath"].Replace("\\", "/")/@Path.GetFileName(file)');window.close(); ">@Path.GetFileName(file)</a></li>
                    }
                }
            
            </ul>
        }
    </section>
</body>
</html>

页面引用了JQUERY,树状菜单部分是jquery的treeview插件,可自行GOOGLE,也可留言,我email给你。
其中的ICStars2_0.Common.UrlHelper.SafeAddQueryToURL方法,其实是我比较懒了随便GOOGLE了一个使用,就是给URL添加参数。代码如下:

#region = SafeAddQueryToURL =
        /// <summary>
        /// Add a query to an URL.
        /// if the URL has not any query,then append the query key and value to it.
        /// if the URL has some queries, then check it if exists the query key already,replace the value, or append the key and value
        /// if the URL has any fragment, append fragments to the URL end.
        /// </summary>
        /// <example>
        ///             string s = "http://blog.csdn.net/leewhoee/?a=1&b=2&c=3#tag";
        /// WL(SafeRemoveQueryFromURL("a",s));
        /// WL(SafeRemoveQueryFromURL("b",s));
        /// WL(SafeRemoveQueryFromURL("c",s));
        /// WL(SafeAddQueryToURL("d","new",s));
        /// WL(SafeAddQueryToURL("a","newvalue",s));
        ///            输出如下:
        ///            http://blog.csdn.net/leewhoee/?b=2&c=3#tag
        ///            http://blog.csdn.net/leewhoee/?a=1&c=3#tag
        ///            http://blog.csdn.net/leewhoee/?a=1&b=2#tag
        ///            http://blog.csdn.net/leewhoee/?a=1&b=2&c=3&d=new#tag
        ///            http://blog.csdn.net/leewhoee/?a=newvalue&b=2&c=3#tag
        /// </example>
        public static string SafeAddQueryToURL(string key, string value, string url)
        {
            int fragPos = url.LastIndexOf("#");
            string fragment = string.Empty;
            if (fragPos > -1)
            {
                fragment = url.Substring(fragPos);
                url = url.Substring(0, fragPos);
            }
            int querystart = url.IndexOf("?");
            if (querystart < 0)
            {
                url += "?" + key + "=" + value;
            }
            else
            {
                Regex reg = new Regex(@"(?<=[&\?])" + key + @"=[^\s&#]*", RegexOptions.Compiled);
                if (reg.IsMatch(url))
                    url = reg.Replace(url, key + "=" + value);
                else
                    url += "&" + key + "=" + value;
            }
            return url + fragment;
        }
        #endregion

        #region = SafeRemoveQueryFromURL =
        /// <summary>
        /// Remove a query from url
        /// </summary>
        /// <param name="key"></param>
        /// <param name="url"></param>
        /// <returns></returns>
        public static string SafeRemoveQueryFromURL(string key, string url)
        {
            Regex reg = new Regex(@"[&\?]" + key + @"=[^\s&#]*&?", RegexOptions.Compiled);
            return reg.Replace(url, new MatchEvaluator(PutAwayGarbageFromURL));
        }
        private static string PutAwayGarbageFromURL(Match match)
        {
            string value = match.Value;
            if (value.EndsWith("&"))
                return value.Substring(0, 1);
            else
                return string.Empty;
        }
        #endregion

致此,“浏览服务器端图片或文件”部分就完成了。


上传图片或文件


上图:





(最后修改 2014/6/11)

因为这个弹框是CKEditor提供的,我们只需要处理请求。下面是处理WEB请求的ACTION(可以用任何语言处理些请求,逻辑上大体相同):

[HttpPost]
        public ActionResult FileUpload()
        {
            var ckEditorFuncNum = Request.QueryString["CKEditorFuncNum"];
            var type = Request.QueryString["Type"];
            var isImage = !string.IsNullOrEmpty(type) && type.Equals("Images", StringComparison.InvariantCultureIgnoreCase);
            var maxContentLength = isImage ? 512*1024 : 1024*1024;
            var file = Request.Files["upload"];
            if (file == null)
            {
                return Content("No file has been chosen!");
            }
            if (file.ContentLength > maxContentLength)
            {
                return Content("The image file size should be no bigger than 512KB! The document file size should be no bigger than 1024KB!");
            }
            var urlpath = string.Empty;
            var datestamp = DateTime.Now.ToString("MMddyyyy");
            var rootfolderpath = isImage ? "/Images/" : "/docs/";
            var folderpath = Server.MapPath(rootfolderpath) + datestamp;
            if (file.ContentLength > 0)
            {
                var filename = Path.GetFileNameWithoutExtension(file.FileName);
                var fileextension = Path.GetExtension(file.FileName);
                var timestamp = DateTime.Now.ToString("MMddyyyyHHmmssfff");
                var filepath = string.Format("{0}/{1}{2}{3}", folderpath, filename, timestamp,
                                                fileextension);
                urlpath = string.Format("{4}{0}/{1}{2}{3}", datestamp, filename, timestamp,
                                                fileextension, rootfolderpath);
                if (!Directory.Exists(folderpath))
                {
                    Directory.CreateDirectory(folderpath);
                }
                file.SaveAs(filepath);
            }
            return
                Content(
                    string.Format(
                        @"<script type=""text/javascript"">window.parent.CKEDITOR.tools.callFunction({0}, ""{1}"");</script>",
                        ckEditorFuncNum, urlpath));
        }

如果你不懂ASP.NET MVC,下面做一些简单的解释。[HttpPost]表明只处理POST请求,return Content("")是返回一个纯文本字符串,其它部分大同小异。唯一值得注意的是最后返回了一段javascript脚本给CKEditor,它促使窗口跳转到Image Info选项卡并把图片URL传递过去,然后预览。如下图:





图片或文件上传部分到这里为止,下面介绍怎么配置CKEditor。


CKEditor配置



CKEditor里有一个配置文件config.js,我们只需要设置几个链接就可以了。代码如下:

/**
 * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
 * For licensing, see LICENSE.html or http://ckeditor.com/license
 */

CKEDITOR.editorConfig = function (config) {
    config.extraPlugins = "autogrow,imagebrowser,filebrowser";
    /*config autogrow*/
    config.autoGrow_maxHeight = 400;
    /*config autogrow end*/
    /*config imagebrowser*/
    //config.imageBrowser_listUrl = "";
    /*config imagebrowser end*/

    /*config filebrowser*/
    config.filebrowserImageBrowseUrl = '/SHTracker/CKEditor/Browse?type=Images';
    config.filebrowserImageUploadUrl = '/SHTracker/CKEditor/FileUpload?type=Images';
    config.filebrowserBrowseUrl = '/SHTracker/CKEditor/Browse?type=docs';
    config.filebrowserUploadUrl = '/SHTracker/CKEditor/FileUpload?type=docs';
    config.filebrowserImageWindowWidth = 640;
    config.filebrowserImageWindowHeight = 480;
    /*config filebrowser end*/
    // Define changes to default configuration here. For example:
    // config.language = 'fr';
    // config.uiColor = '#AADC6E';
    config.skin = 'Moono';
    config.disableNativeSpellChecker = false;
};

extraPlugins里设置了imagebrowser图片浏览和filebrowser文件浏览。然后为其配置处理请求的URL:
config.filebrowserImageBrowseUrl = '/SHTracker/CKEditor/Browse?type=Images';
    config.filebrowserImageUploadUrl = '/SHTracker/CKEditor/FileUpload?type=Images';
    config.filebrowserBrowseUrl = '/SHTracker/CKEditor/Browse?type=docs';
    config.filebrowserUploadUrl = '/SHTracker/CKEditor/FileUpload?type=docs';

请确保你的URL可以正确访问。此时,这个CKEditor的文件图片上传插件就完成了。


总结


相信不愿意花钱买CKEditor插件的朋友一定用的上此功能。对于一个富文本编辑器,怎么能没有文件图片上传功能呢?CKEditor又这么简单好用,功能强大,实在没有勇气放弃它而去选择其它的产品。自已从零开始开发一个富文本编辑器?重复造轮子的活儿没有几个人愿意干吧?希望能帮到有需要的人,如果用上了请顶一下吧,特此感谢~~







  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CKEditor 4 是一个非常流行的富文本编辑器,它允许用户在网页上进行文本编辑,并支持上文件。 要在 CKEditor 4 中实现文件上功能,需要通过相关的件来实现。以下是一个基本的步骤指南: 1. 首先,确保你正确地将 CKEditor 4 集成到你的网页中,详细的集成方法可以在官方文档中找到。 2. 为了实现文件上功能,你需要一个文件上件。常用的件有 "Upload Image" 和 "Upload File"。你可以在 CKEditor 官方网站的件页面上找到这些件,并按照指南进行下载和安装。 3. 安装完成后,需要在 CKEditor 的配置中启用相应的件。可以通过配置文件或者 JavaScript 代码来进行配置。具体的配置方法可以在件的文档中找到。 4. 配置件后,你需要配置文件上的目标路径。通常,服务器端会有一个接口来接收上的文件并保存它们。在件的配置中,你可以指定接口的 URL,并设置其他相关的配置参数,如文件类型限制、最大文件大小等。 5. 最后,通过设置 CKEditor 的 toolbar,将文件上按钮添加到编辑器的工具栏中,以便用户能够使用该功能。 总结一下,要在 CKEditor 4 中实现文件上功能,首先需要安装相应的文件上件,然后配置件和服务器接口,并将上按钮添加到编辑器的工具栏中。这样,用户就可以通过点击上按钮,选择并上文件到指定的服务器路径上了。 ### 回答2: CKEditor 4 是一种常用的富文本编辑器,用于在网页中编辑和排版文本。要实现在 CKEditor 4 中上文件,可按照以下步骤进行操作: 1. 配置服务器端的文件上功能:首先,需要在服务器上设置一个用于接收和处理文件上的脚本。该脚本必须具备处理文件上的功能,并将文件保存到服务器指定的目录中。 2. 配置前端页面中的上按钮:在 CKEditor 4 的工具栏中,可以添加一个自定义的按钮,作为文件上的入口。可以使用 CKEditor 提供的工具栏配置选项,选择合适的图标和按钮样式。 3. 编写 JavaScript 代码:在页面加载 CKEditor 4 时,需要编写一些 JavaScript 代码来处理上按钮的点击事件。可以使用 CKEditor 提供的 API 方法来调用文件上脚本,并指定文件上后的回调函数。 4. 文件上:当用户点击上按钮时,会触发 JavaScript 代码中的上事件。该事件会将用户选择的文件发送到服务器端的上脚本进行处理。上脚本会将文件保存到指定的目录,并返回一个文件的存储路径或唯一的文件标识符。 5. 在编辑器中入文件链接:当上脚本处理完文件上后,可以通过 JavaScript 将文件的链接入到 CKEditor 4 的编辑区域。可以使用 CKEditor 提供的 API 方法来实现这一功能。 需要注意的是,文件上涉及到服务器端和客户端的交互,故需要一定的后端开发经验和前端技术知识。同时,还需要对文件的上与安全性有一定的了解,以确保上操作的安全和有效性。 ### 回答3: CKEditor是一个流行的富文本编辑器,可以用来方便地上和编辑文本内容。要在CKEditor中实现文件上功能,我们可以按照以下步骤进行操作。 首先,我们需要在HTML页面中引入CKEditor的相关文件,包括主要的编辑器代码、上件和相应的样式表。 其次,我们需要在页面中定义一个用于展示CKEditor的textarea元素,并为其指定一个id,以便之后的操作。 接下来,我们可以通过JavaScript代码来初始化CKEditor编辑器。通过CKEDITOR.replace()方法,我们可以将之前定义的textarea元素与CKEditor绑定起来,并指定一些编辑器的配置选项。 当CKEditor初始化完成后,我们可以在代码中添加一个上文件的按钮,通过JavaScript代码为其添加点击事件处理函数。 在点击上按钮时,我们可以调用CKEditor提供的文件上方法。通过CKEDITOR.uploadUrl()方法,我们可以设置上文件的URL路径,以及回调函数来处理上成功后的操作。 在上文件成功后,我们可以通过回调函数来处理返回的数据。可以通过CKEditor提供的接口来获取上文件的URL,在编辑器中入图片或链接等操作。 总的来说,要在CKEditor4中实现文件上功能,我们需要引入相关的文件和件,定义编辑器的相关设置,通过按钮和上方法来触发文件上操作,并在成功后进行相关操作。这样就可以实现在CKEditor中方便地上文件了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值