kingedit 上传php_为Kindeditor控件添加图片自动上传功能

Kindeditor是一款功能强大的开源在线HTML编辑器,支持所见即所得的编辑效果。它使用JavaScript编写,可以无缝地与多个不同的语言环境进行集成,如.NET、PHP、ASP、Java等。官方网站可以查看这里:http://kindeditor.net/index.php

Kindeditor本身提供了许多非常实用的插件,由于代码开源,开发人员可以根据需要对其进行任意扩展和修改。

在使用Kindeditor编辑网站内容时考虑这样一个场景:编辑人员往往会从其它页面或者Word文档将内容复制到Kindeditor编辑器中,而不会从一张白纸开始编写内容。如果所复制的内容中包含图片,则需要首先将图片从源地址下载到本地,然后将其上传到本网站所在的服务器,否则图片仍然会指向你所复制的页面或者文档,这会导致图片可能在页面中无法正确打开。编辑人员往往要处理许多的文档,这样的操作无疑非常繁琐。能否让Kindeditor自动识别粘贴到其中的内容,并将图片自动上传到服务器呢?下面的代码实现了这一功能。

有关如何在页面中使用Kindeditor可以去查看官方网站的文档,这里不再详细介绍。

实现该功能的基本思路:在Kindeditor编辑器的keyup事件中添加代码,以检查编辑器的内容中是否包含图片;找出需要自动上传到服务器的图片,通过Ajax方式调用图片上传程序将图片上传到服务器;在Ajax的回调函数中将对应图片的src地址修改为本地相对地址。

该功能不支持将Word中的图片复制出来并上传到服务器。

上图是最终实现效果。程序会自动识别编辑器中的内容,如果有图片需要上传,则会在编辑器的顶部显示一条提示信息。用户点击“上传”链接,程序会通过Ajax请求调用图片上传程序,并在回调函数中将对应图片的src地址修改为本地相对地址。

具体实现步骤及相关代码:

1. Kindeditor编辑器修改

找到kindeditor.js文件,在keyup()事件中添加自定义代码。不同版本的Kindeditor所提供的代码差别可能会比较大,需要借助于官方文档进行查找。本文基于Kindeditor 4.1.10版本。

2. auto.js文件代码

functiondf() {var haspicContainer = document.getElementById("has_pic");if (haspicContainer == null) {

haspicContainer= document.createElement("div");

haspicContainer.id= "has_pic";

haspicContainer.innerHTML= "

您有图片需要上传到服务器   上传

$(".ke-toolbar").after(haspicContainer);

}var img = $(".ke-edit-iframe").contents().find("img");var piccount = 0;var sstr = "";

$(img).each(function(i) {var that = $(this);if (that.attr("src").indexOf("http://") >= 0 || that.attr("src").indexOf("https://") >= 0) {

piccount++;if (i == $(img).length - 1)

sstr+= that.attr("src");elsesstr+= that.attr("src") + "|";

}

});

$("#piclist").val(sstr);

document.getElementById("has_pic").style.display = (piccount > 0) ? "block" : "none";

}functioncloseupload() {

$("#has_pic").hide();

$("#upload").show();

}functionuploadpic() {var piclist = encodeURI($("#piclist").val());if (piclist.length == 0) return false;

$.ajax({

url:"asp.net/uploadpic.ashx",

data:"pic=" +piclist,

type:"GET",

beforeSend:function() {

$("#upload").hide();

$("#confirm").text("正在上传中...");

},

success:function(msg) {if (msg !== "") {var str = newArray();

str= msg.split('|');var img = $(".ke-edit-iframe").contents().find("img");

$(img).each(function(i) {var that = $(this);if (that.attr("src").indexOf("http://") >= 0 || that.attr("src").indexOf("https://") >= 0) {

that.attr("src", "/uploads/image/" +str[i]);

that.attr("data-ke-src", "/uploads/image/" +str[i]);

}

});

$("#confirm").html(img.length + "张图片已经上传成功!  关闭");

}else $("#confirm").text("上传失败!");

}

});

}

其中的$(".ke-edit-iframe").contents().find("img")用来查找编辑器内容中的所有图片。默认情况下,编辑器的内容被存放在iframe元素中,该iframe拥有class="ke-edit-iframe"的属性。程序会判断每个图片src属性的值中是否包含"http://"或者"https://",从而确定该图片是远程图片还是本地图片。如果图片为远程图片,则通过jQuery的ajax方法调用uploadpic.ashx将图片上传到服务器。同时在回调函数中修改对应图片的src地址。

3. uploadpic.ashx文件代码

public classuploadpic : IHttpHandler

{public voidProcessRequest(HttpContext context)

{

context.Response.ContentType= "text/plain";string pic = context.Request.QueryString["pic"];string[] arr = pic.Split('|');string sstr = "";

UpLoadIMG st= newUpLoadIMG();for (int i = 0; i < arr.Length; i++)

{if (arr[i].IndexOf("http://") >= 0 || arr[i].IndexOf("https://") >= 0)

{string std = st.SaveUrlPics(arr[i], "../../uploads/image/");if (std.Length > 0)

{if (i == arr.Length - 1)

sstr+=std;elsesstr+= std + "|";

}

}

}

context.Response.Write(sstr);

}public boolIsReusable

{get{return false;

}

}

}public classUpLoadIMG

{

public string SaveUrlPics(string imgurlAry, stringpath)

{string strHTML = "";string dirPath =HttpContext.Current.Server.MapPath(path);try{if (!Directory.Exists(dirPath))

{

Directory.CreateDirectory(dirPath);

}string ymd = DateTime.Now.ToString("yyyyMMdd", DateTimeFormatInfo.InvariantInfo);

dirPath+= ymd + "/";if (!Directory.Exists(dirPath))

{

Directory.CreateDirectory(dirPath);

}string newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + imgurlAry.Substring(imgurlAry.LastIndexOf("."));

WebClient wc= newWebClient();

wc.DownloadFile(imgurlAry, dirPath+newFileName);

strHTML= ymd + "/" +newFileName;

}catch(Exception ex)

{//return ex.Message;

}returnstrHTML;

}

}

远程图片通过WebClient方法下载到服务器的相对路径"/uploads/image/"中,并且会按照日期自动生成文件夹和对应的文件名。返回的结果中包含了以"|"分隔的所有图片的本地相对地址,在步骤2的auto.js文件的uploadpic()函数中,回调方法success获取到该值并进行解析,将地址赋值给对应图片的src属性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值