kindeditor4跨域上传图片解决

项目中正在使用kindeditor, 版本号4.1.10

非常多公司的图片会走CDN,须要单独的一台图片上传服务如:(upload.268xue.com)

kindeditor上传图片的简单内部流程:

上传button是提交到iframe。生成1个form和1个iframe,form提交到(arget)iframe

iframe的onload方法获取返回的值。然后调用配置回调方法afterUpload/afterError。

详细实现:(在a.com选中图片,上传用upload.268xue.com,返回上传的结果给a.com。我的项目springmvc):

跨域中使用须要改动2个地方:1.上传后的返回方式,2回调的页面处理。

1.upload.268xue.com的上传方法:

@RequestMapping(value = "/upload", method = RequestMethod.POST)
    public String upload(HttpServletRequest request, HttpServletResponse response) {
        try {
            String referer = request.getHeader("referer");
            Pattern p = Pattern.compile("([a-z]*:(//[^/?#]+)?)?", Pattern.CASE_INSENSITIVE);
            Matcher mathcer = p.matcher(referer);
            if (mathcer.find()) {
                String callBackPath = mathcer.group();// 请求来源a.com
                MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
                MultipartFile imgFile = multipartRequest.getFile("fileupload");//k4中fileupload
                //JsonObject json =自己的处理imgFile
                // 同域时直接返回json.toString()就可以无需redirect
                String url = "redirect:" + callBackPath + "/kindeditor/plugins/image/redirect.html?s=" + json.toString() + "#" + json.toString();
                logger.info(String.format("upload success url:%s", url));
                return url;
            } else {
                logger.info("upload referer not find");
            }
        } catch (Exception e) {
            logger.error("upload error", e);
        }
        return null;
    }

上传自己实现。重点是返回,我的打印结果:

upload success url:http://a.com/kindeditor/plugins/image/redirect.html?

s={"error":0,"url":"http://upload.268xue.com/upload/sns/temp/20140510/1399706737140139370.jpg"}#{"error":0,"url":"http://upload.268xue.com/upload/sns/temp/20140510/1399706737140139370.jpg"}

redirect有參数s和#号是反复的,非常low,在a.com中用到。期望改动掉。

2.a.com中编辑器的初始化:

	var uploadbutton = KindEditor.uploadbutton({
		button : KindEditor("fileupload")[0],
		fieldName : "fileupload",
		url : "http://upload.268xue.com/upload",
		afterUpload : function(data) {
			if (data.error == 0) {
	           	 //data.url 处理
			} else {
				alert("error");
			}
		},
		afterError : function(str) {
			//alert(‘error: ‘ + str);
		}
	});
	uploadbutton.fileBox.change(function(e) {
		uploadbutton.submit();
	});

button:fileupload。没有特殊的地方。

3.a.com中kindeditor\plugins\image\redirect.html内容:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>ie shit shit</title>
<script type="text/javascript">
		//获取url參数
	    function getParameter(val) {
	    	var uri = window.location.search;
	    	var re = new RegExp("" + val + "=([^&?

]*)", "ig");
	    	return ((uri.match(re)) ?

(uri.match(re)[0].substr(val.length + 1)) : null);
	    }
        var upload_callback = function(){
        	var data=getParameter("s");
        	var location_hash=location.hash;
        	//ie6取不到hash??

?用那个方式取?暂使用url传參数s
        	if(location_hash!=null && location_hash!="" && location_hash){
        		 var data = location.hash ? location.hash.substring(1) : ‘‘;
                 document.getElementsByTagName("body")[0].innerHTML = ‘<pre>‘ + data  + ‘</pre>‘;
        	}else{
        		 var data=getParameter("s");
        		 document.getElementsByTagName("body")[0].innerHTML = ‘<pre>‘ + data  + ‘</pre>‘;
        	}
        };
    </script>
</head>
<body onload="upload_callback();">
</body>
</html>

当中參数s和#号自己处理下能够仅仅用1个。

以上IE6、7、8、9、10、火狐、chrome測试通过。苹果浏览器safari測试未通过。

===========================================================

safari下原因:请求redirect.html后iframe的onload调用处理时转为json时出错:

如:http://a.com/kindeditor/plugins/image/redirect.html?

s=%7B%22error%22:0,%22url%22:%22/upload/demo_web/temp/20140510/1399698690364609649.jpg%22%7D#%7B%22error%22:0,%22url%22:%22/upload/demo_web/temp/20140510/1399698690364609649.jpg%22%7D

处理后结果:%7B%22error%22:0,%22url%22:%22/upload/demo_web/temp/20140510/1399698690364609649.jpg%22%7D

转为json时出错。应该格式为:{"error":0,"url":"/upload/demo_web/temp/20140510/1399698690364609649.jpg"}

例如以下图的str转json:K.json(str).(kindeditor-all.js 4196-4206行)

应该是请求有问题,暂时解决,改动kindeditor-all.js(错误时再尝试下转码)

自己的处理,低级的地方多指正学习。

时间: 2024-10-10 17:13:19

kindeditor4跨域上传图片解决的相关文章

ueditor富文本编辑器跨域上传图片解决办法

在使用百度富文本编辑器的过程中,如果是有一台单独的图片服务器就需要将上传的图片内容放到图片服务器,也就是比如在a.com的编辑器上传图片,图片要保存到img.com的跨域上传图片功能,而在ueditor官方文档中说不支持单图上传的跨域, 网上查了一下各种花里胡哨,一顿操作猛如虎,比如加document.domain,配置全域名的等等都是然并卵,我仔细研究了一下ueditor的demo文件,相出了一个折中办法,很简单只需要修改demo中两个地方的代码外加写一个上传接口即可. 首先引入页面uedit

跨域上传图片的尝试过程,最终成功了。哈哈

关于这个跨域上传图片的问题,其实去年底的时候就该去实现的,因为老板朝三暮四,一会儿让做这个,一会儿看那个,就耽误了.因为这个过程花费了我整整一天的时间,我认为有必要记录下来. 首先,项目是一个ERP,针对的是公司的一个小型电商的网站.项目经理让我搭建一个图片服务器, 当时也是为了完(尝)成(尝)任(新)务(鲜),用的都是当时从没接触过的.通过百度就选择了 Nginx + Nodejs + express + ImageMagick 来实现的. 当时还简单看了一下淘宝的TFS(Taobao Fil

让 umeditor 支持跨域上传图片

事实上,umeditor 上传图片采用的是 form+隐藏iframe方式,已经能做到无刷新跨域上传.但小小遗憾的是做的并不完美,上传图片后,反馈的json信息,js并不能读取.原因在于,js不能操作跨域的iframe. 1 var r = this.contentWindow.document.body.innerHTML; 此句代码在FF Chrome上都会报错.浏览器的这种限制,可以通过两个方式来解决 换成flash上传 主页跟iframe页都设置 document.domain . 第一

Nginx反向代理、CORS、JSONP等跨域请求解决方法总结

由于 Javascript 同源策略的存在使得一个源中加载来自其它源中资源的行为受到了限制.即会出现跨域请求禁止. 通俗一点说就是如果存在协议.域名.端口或者子域名不同服务端,或一者为IP地址,一者为域名地址(在跨域问题上,域仅仅是通过“ url的首部 ”来识别而不会去尝试判断相同的IP地址对应着两个域或者两个域是否同属同一个IP),之中任意服务端旗下的客户端发起请求其它服务端资源的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源. 但很多时候我们却又不得不

JS跨域(ajax跨域、iframe跨域)解决方法及原理详解(jsonp)

这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被当作是不同的域. 下表给出了相对 http://store.company.com/dir/page.html 同源检测的结果: 要解决跨域的问题,我们可以使用以下几种方法: 1.通过jsonp跨域[解决ajax跨域] 在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的

AJAX跨域的解决办法? 同步异步

1. HTTP协议的状态消息都有哪些? 1**:请求收到,继续处理2**:操作成功收到,分析.接受3**:完成此请求必须进一步处理4**:请求包含一个错误语法或不能完成5**:服务器执行一个完全有效请求失败   2. AJAX跨域的解决办法?   1.document.domain+iframe的设置 对于主域相同而子域不同的例子,可以通过设置document.domain的办法来解决. 具体的做法是可以在http://www.a.com/a.html和http://script.a.com/b

相关前台跨域的解决方式

title: 前端跨域处理方式 date: 2018-07-08 00:37:29 categories: Web 前端 tags: 跨域 cors 关于跨域请求解觉方案问题 关于浏览器跨域问题,项目中也遇到了,看了项目上一些代码的处理方式,感觉存在不少不大完善的地方,因此对于跨域,想好好梳理一下,但是最近一直在忙,因此周六抽出一天的时间了学习消化做了写笔记. 跨域的概念 跨域和同源问题 跨域实质就是跨域名.跨端口.跨协议. 同源就是同域名.同端口.同协议. 假如一个网址是 http://bai

Access to XMLHttpRequest at &#39;XXX&#39; from origin &#39;XX&#39; has been blocked by CORS policy: No &#39;Access-Control-Allow-Origin&#39; header is present o AJAX跨域请求解决方法

今天出现了一个问题找了好久先看代码: 这可能是个BUG吧插入代码: dataType: 'jsonp', crossDomain: true, 最终: Access to XMLHttpRequest at 'XXX' from origin 'XX' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present o AJAX跨域请求解决方法 原文地址:https://www.cnblogs

&#183;基于thinkphp5.0和百度编辑器UMeditor 跨域上传图片实现

1.下载两者源码: 2,简单配置 :   a. 一套thinkphp框架是显示前端界面,搭配编辑器环境.对应域名为 http://tp.com:  这是前端界面配置 但是还要修改一下umeditor.config.js 文件    这里配置那个URL ,我思考了很久         我是这么想的  本地站点域名配置到了www/tp5/public位置 ,现在是要实例编辑器加一个路径,而编辑器的文件位置就在public下面: 在此情况下 编辑器会在界面正常显示: 好接下来考虑的问题就是图片上传了.