xheditor html5,Flask项目集成富文本编辑器XHEditor

本文介绍如何在Flask项目中集成富文本编辑器xhEditor,并实现图片上传、文件上传、视频上传、远程抓图等(包括拖拽上传)功能。

xhEditor简介

xhEditor是一个基于jQuery开发的简单迷你并且高效的可视化HTML编辑器,基于网络访问并且兼容IE 6.0+, Firefox 3.0+, Opera 9.6+, Chrome 1.0+, Safari 3.22+。

xhEditor曾经是我比较喜欢的编辑器,也是率先支持拖拽上传的编辑器之一。xhEditor在当年是优秀的编辑器,功能足够强大,使用体验也相当好,拖拽上传是我最喜欢的功能,只可惜已经停止开发了。xhEditor最后的稳定版本是1.1.14,至今已超过2年未更新(2013年发布了开发版本1.2.1),作者已经停止开发和维护了,社区论坛完全不能打开。

由于xhEditor基于jQuery开发,而对于新版本的jQuery,它并不能很好的支持,只有1.4版本的jQuery是支持得最好的。

虽然已经不再更新了,但在一些需要富文本编辑器的场合,她还是可以完全胜任的。

本文以1.1.14版本为例,讲述如何在Flask项目中使用xhEditor编辑器,并实现图片上传、文件上传的后端功能。

在Flask项目中使用xhEditor

首先我们需要到xhEditor官网下载1.1.14版本的xhEditor编辑器,下载之后解压到

Flask项目的static/xheditor目录。

201412222259013544.jpg

201412222300509415.jpg

xhEditor提供2种初始化方式:Class初始化和JavaScript初始化。Class初始化只需要给textarea设置值为xheditor的class属性,它就会自动变成xhEditor编辑器,一个页面可以同时同在多个编辑器,而且这个类属性可以添加参数。(PS:CKEditor也有这个功能)

对于这两种初始化方式,官网有提供设置很方便的设置向导,使得配置相对比较简单。

示例代码:

html

现在,我们就拥有一个xhEditor编辑器了。

201412222259096587.jpg

开启上传功能

xhEditor的上传功能需要设置几个参数(以图片上传为例):

upImgUrl : 图片文件上传接收URL,例:/upload/,可使用内置变量{editorRoot}

upImgExt : 图片上传前限制本地文件扩展名,默认:jpg,jpeg,gif,png

这里假设上传文件接收URL为/upload/,我们的编辑器初始化代码就变成:

html

其他类型的文件上传设置类推。

Flask处理上传请求

xhEditor支持2种上传方式:标准HTML4上传和HTML5上传。

HTML4上传使用标准的表单上传域,上传文件域的name为:filedata

HTML5上传的整个POST数据流就是上传的文件完整数据,而本地文件名等信息储

存于HTTP_CONTENT_DISPOSITION这个服务器变量中

返回内容必需是标准的json字符串,结构可以是如下:

{"err":"","msg":"200906030521128703.gif"} 或者

{"err":"","msg":{"url":"200906030521128703.jpg","localfile":"test.jpg","id":"1"}}

注:若选择结构2,则url变量是必有。

文件上传处理示例代码:

pythondef gen_rnd_filename():

filename_prefix = datetime.datetime.now().strftime('%Y%m%d%H%M%S')

return '%s%s' % (filename_prefix, str(random.randrange(1000, 10000)))

@app.route('/upload/', methods=['GET', 'POST'])

def upload():

'''文件上传函数

本函数未做上传类型判断及上传大小判断。

'''

result = {"err": "", "msg": {"url": "", "localfile": ""}}

if request.method == 'POST' and 'filedata' in request.files:

# 传统上传模式,IE浏览器使用这种模式

fileobj = request.files['filedata']

fname, fext = os.path.splitext(fileobj.filename)

rnd_name = '%s%s' % (gen_rnd_filename(), fext)

fileobj.save(os.path.join(app.static_folder, 'upload', rnd_name))

result["msg"]["localfile"] = fileobj.filename

result["msg"]["url"] = '!%s' % \

url_for('static', filename='%s/%s' % ('upload', rnd_name))

elif 'CONTENT_DISPOSITION' in request.headers:

# HTML5上传模式,FIREFOX等默认使用此模式

pattern = re.compile(r"""\s.*?\s?filename\s*=\s*['|"]?([^\s'"]+).*?""", re.I)

_d = request.headers.get('CONTENT_DISPOSITION').encode('utf-8')

if urllib.quote(_d).count('%25') > 0:

_d = urllib.unquote(_d)

filenames = pattern.findall(_d)

if len(filenames) == 1:

result["msg"]["localfile"] = urllib.unquote(filenames[0])

fname, fext = os.path.splitext(filenames[0])

img = request.data

rnd_name = '%s%s' % (gen_rnd_filename(), fext)

with open(os.path.join(app.static_folder, 'upload', rnd_name), 'wb') as fp:

fp.write(img)

result["msg"]["url"] = '!%s' % \

url_for('static', filename='%s/%s' % ('upload', rnd_name))

return json.dumps(result)

远程抓图

一般情况下,当复制站外的图片时,我们希望可以把图片保存到本地,远程抓图就可以完成这个事情。

启用远程抓图功能,需要设置2个参数:

localUrlTest : 非本站域名测试正则表达式

remoteImgSaveUrl : 远程图片抓取接收程序URL

设置这2个参数之后,我们的编辑器初始化代码变成:

html

这里表示抓取除localhost之外其它域名的图片。

远程抓图处理示例代码:

pythondef gen_rnd_filename():

filename_prefix = datetime.datetime.now().strftime('%Y%m%d%H%M%S')

return '%s%s' % (filename_prefix, str(random.randrange(1000, 10000)))

@app.route('/uploadremote/', methods=['POST'])

def uploadremote():

"""

xheditor保存远程图片简单实现

URL用"|"分隔,返回的字符串也是用"|"分隔

返回格式是字符串,不是JSON格式

"""

localdomain_re = re.compile(r'https?:\/\/[^\/]*?(localhost:?\d*)\/', re.I)

imageTypes = {'gif': '.gif', 'jpeg': '.jpg', 'jpg': '.jpg', 'png': '.png'}

urlout = []

result = ''

srcUrl = request.form.get('urls')

if srcUrl:

urls = srcUrl.split('|')

for url in urls:

if not localdomain_re.search(url.strip()):

downfile = urllib.urlopen(url)

fext = imageTypes[downfile.headers.getsubtype().lower()]

rnd_name = '%s%s' % (gen_rnd_filename(), fext)

with open(os.path.join(app.static_folder, 'upload', rnd_name), 'wb') as fp:

fp.write(downfile.read())

urlreturn = url_for('static', filename='%s/%s' % ('upload', rnd_name))

urlout.append(urlreturn)

else:

urlout.append(url)

result = '|'.join(urlout)

return result

完整DEMO

小结

虽然xhEditor已经不再更新了,但仍不失为一款优秀的富文本编辑器,它的文件上传方式也值得借鉴。不过呢,项目中更多地会选择CKEditor或者UEditor这类比较活跃的编辑器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
软件介绍xhEditor是一个基于jQuery开发的简单迷你并且高效的可视化XHTML编辑器,基于网络访问并且兼容IE 6.0-8.0,Firefox 3.0,Opera 9.6,Chrome 1.0,Safari 3.22。Features(特点): Small:初始加载5个文件,包括:1个js(36k)+2个css(6k)+2个图片(4k),总共46k。若js和css文件进行gzip压缩,可以进一步缩减为18k左右。 Fast:基于jQuery引擎开发,提供高效的代码执行效率 Simple:简单的调用方式,加一个class属性就能将您的textarea立马变成一个功能丰富的可视化编辑器。 Word:实现Word代码自动检测并清理,提供高效完美的Word代码过滤方案,生成代码最优化精简,但是却不丢失任何细节效果。 UBB: 提供完美的UBB可视化编辑解决方案,在您获得安全高效代码存储的同时,又能享受可视化编辑的便捷 ver 0.9.7 Change(2009-7-21) 1.调整:标签显示功能由原先的显示在左上方并增高8像素,改为显示在右上方且不增高 2.调整:编辑器内部的settings变量由原先的内部变量改为公有变量,以方便从外部动态的对参数进行修改 3.修正:修正了Chrome浏览器下字体效果转换错误的问题,此问题仅出现在0.9.6版中 4.修正:在非WebKit内核下,使用3个字符的16进制颜色值无效的问题进行了修正,例:<span xss=removed>aaa</span> 5.修正:appendHTML和pasteHTML两个函数添加的图片或者链接,相对地址变绝对地址问题的修正 6.修正:XHTML格式化功能进一步完善,例:<b>aaa<bbb>,修正前<bbb这部分内容会消失,修正后此BUG消失 7.修正:之前表情插入后默认是选中当前表情,现修正为插入表情后光标定位在表情之后,这样便于在后面继续插入新表情 8.添加:ajax上传功能模块化,使链接、动画和视频在不增加代码大小的情况下都具备上传功能 9.添加:在readonly只读模式下除了全屏和关于按钮可用,其它所有按钮都禁用,并且内容不可编辑,可通过toggleReadonly接口来进行切换状态 10.添加:showModal接口,模仿桌面程序的模式窗口,必需完成窗口内事件或者关闭窗口才能返回窗口,本程序已扩展到ajax上传模块中,并可在插件中调用

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值