在之前的一篇文章中介绍了如何将富文本kindeditor结合到django中:Django2.0.4结合KindEditor 4.1.11富文本编辑器
在同域环境中是没有问题的,换句话说,也就是上传接口如果部署在前端页面同一个域名下是没有问题的,然而美多商城的系统架构是前后端分离,前端页面是vue.js服务,后端接口是Django的服务,分别部署在不同的服务器上,如果在vue.sj页面中想要使用kindeditor中的上传文件功能,跨域请求的Django的接口就会报错。
本文解决在跨域情况下使用kindeditor的上传文件功能,解决思路就是用重定向方法来伪造成同域环境
在前端项目中,建立一个将redirect.html,用来伪造同域获取参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <html> <head> <meta http-equiv = “Content-Type” content = “text / html; charset = UTF-8” > <title> 跨域重定向</ title> <script type = “text / javascript “ > 函数的getParameter (VAL ){ VAR URI = decodeURI (窗口。位置。搜索); var re = new RegExp (“” + val + “=([^&
“ig” ); 返回((URI 。匹配(重)) ?( URI 。匹配(重)[ 0 ] SUBSTR (VAL 。长度+ 1 )) :空); }
var upload_callback = function (){ var error = getParameter (“error” ); error = parseInt (error )var dataObject ; if (error == 0 ){ var url = getParameter (“url” ); dataObject = { “error” :error ,“url” :url }; } else { var message = getParameter (“message” ); dataObject = { “error” :error ,“message” :message }; } var data = JSON 。stringify (dataObject ) 文档。getElementsByTagName (“body” )[ 0 ]。innerHTML = '<pre>' + data + '</ pre>' ; } </ script>
<body onload = “ upload_callback (); ” > </ body> </ html>
|
富文本页面并不需要改变什么
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| <!DOCTYPE html> <html lang = “en” > <head> <meta charset = “UTF-8” > <meta name = “viewport” content = “width = device-width,initial-scale = 1.0” > < meta http-equiv = “X-UA-Compatible” content = “ie = edge” > <script src = “./ static / js / jquery-1.12.1.min.js” > </ script> <script src = ” ./static/js/kindeditor/kindeditor-all-min.js'> </ script> <title> 美多编辑器</ title>
</ head> <body>
<textarea id = 'content' > 富文本</ textarea> <button onclick = “ checkit ()” > 查看</ button> <SCRIPT>
initKindEditor (); function initKindEditor (){ var kind = KindEditor 。create ('#content' ,{ uploadJson :'http:// localhost:8000 / md_admin / front_upload' , items :[ 'source' ,'image' ], width :'100%' ,//文本框宽度(可以百分比或像素) 身高:'300px' ,//文本框高度(只能像素) minWidth :200 ,//最小宽度(数字) minHeight :400 //最小高度(数字)}); } 功能checkit (){ VAR 含量= $ (文件。的getElementsByTagName (“IFRAME” )[ 0 ]。contentWindow 。文件。体)。html ()
警报(内容);
} </ script>
</ body> </ html>
|
重点是后台接口文件,不再需要返回JSON数据,而是直接重定向到之前伪造好的前端页面将redirect.html
1 2 3 4 5 6 7 8 9 10 11 12
| item = {} file = request 。文件。得到('imgFile' )#定义跳转网址,就是前端伪造好的页面 callBackPath = 的'http://本地主机:8080 /将redirect.html' ˚F = 开放(OS ,路径,加入(UPLOAD_ROOT ,'' ,文件。
name ),'wb' ) item [ 'message' ] = '上传成功' item [ 'url' ] = 'http:// localhost:8000 / upload /' + file 。名称 item [ 'error' ] = 0 #write文件遍历图片文件流for chunk in file 。chunks (): f 。write (chunk )返回HttpResponseRedirect (callBackPath + “?error = 0&url =” + item [ 'url' ])
|
到此,问题解决,无论富文本在前端调用还是后端,都可以完美上传文件
Author:
Wenng
Slogan:
Do you believe in DESTINY?