阿桂天山的技术小结:Flask+UEditor实现图片文件上传富文本编辑

news2024/11/16 12:42:24

话不多说,有图有源码

先看效果:

 1.前端html页面index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="{{ url_for('static',filename='ueditor/ueditor.config.js') }}"></script>
    <script src="{{ url_for('static',filename='ueditor/ueditor.all.js') }}"></script>
    <script src="{{ url_for('static',filename='ueditor/lang/zh-cn/zh-cn.js') }}"></script>
    <title>Ewangda--测试ueditor</title>
</head>

<body>
<script id="editor" type="text/plain" style="width:80%;height:400px;">
</script>
<script>
    var ue = UE.getEditor("editor",{
        'serverUrl': '/ueditor/upload/'
    });
</script>
</body>
</html>

2.后端ueditor.py执行文件(这个非常重要)

#encoding: utf-8
from flask import Blueprint,request,jsonify,url_for,send_from_directory,current_app as app
from flask_wtf import CSRFProtect
import json
import re
import string
import time
import hashlib
import random
import base64
import sys
import os

# csrf = CSRFProtect()
os.chdir(os.path.abspath(sys.path[0]))

bp = Blueprint('ueditor',__name__,url_prefix='/ueditor')

UEDITOR_UPLOAD_PATH = ""


@bp.before_app_first_request
def before_first_request():
    global UEDITOR_UPLOAD_PATH

    UEDITOR_UPLOAD_PATH = app.config.get('UEDITOR_UPLOAD_PATH')
    if UEDITOR_UPLOAD_PATH and not os.path.exists(UEDITOR_UPLOAD_PATH):
        os.mkdir(UEDITOR_UPLOAD_PATH)

    # csrf = app.extensions.get('csrf')
    # if csrf:
    #     csrf.exempt(upload)


def _random_filename(rawfilename):
    letters = string.ascii_letters
    random_filename = str(time.time()) + "".join(random.sample(letters,5))
    filename = hashlib.md5(random_filename.encode('utf-8')).hexdigest()
    subffix = os.path.splitext(rawfilename)[-1]
    return filename + subffix

# @csrf.exempt#局部关闭CSRF
@bp.route('/upload/',methods=['GET','POST'])
def upload():
    action = request.args.get('action')
    result = {}
    if action == 'config':
        config_path = os.path.join(bp.static_folder or app.static_folder,'ueditor','config.json')
        #print(config_path)#python project\cms\static\ueditor\config.json
        with open(config_path,'r',encoding='utf-8') as fp:
            result = json.loads(re.sub(r'\/\*.*\*\/','',fp.read()))

    elif action in ['uploadimage','uploadvideo','uploadfile']:
        image = request.files.get("upfile")
        filename = image.filename
        save_filename = _random_filename(filename)
        result = {
            'state': '',
            'url': '',
            'title': '',
            'original': ''
        }
        image.save(os.path.join(UEDITOR_UPLOAD_PATH, save_filename))
        result['state'] = "SUCCESS"
        result['url'] = url_for('ueditor.files', filename=save_filename)
        result['title'] = save_filename
        result['original'] = save_filename

    elif action == 'uploadscrawl':#执行上传涂鸦的action名称
        base64data = request.form.get("upfile")
        img = base64.b64decode(base64data)
        filename = _random_filename('xx.png')
        filepath = os.path.join(UEDITOR_UPLOAD_PATH,filename)
        with open(filepath,'wb') as fp:
            fp.write(img)
        result = {
            "state": "SUCCESS",
            "url": url_for('files',filename=filename),
            "title": filename,
            "original": filename
        }

    return jsonify(result)


@bp.route('/files/<filename>/')
def files(filename):
    return send_from_directory(UEDITOR_UPLOAD_PATH,filename)

3.路径配置文件config.py

import os

#上传到本地
UEDITOR_UPLOAD_PATH = os.path.join(os.path.dirname(__file__), 'static\\images')

4.启动运行程序appstart.py

from flask import Flask,render_template

import config
app = Flask(__name__)
app.config.from_object(config)

from ueditor import bp as ueditor_blue
app.register_blueprint(ueditor_blue)

@app.route('/')
def index():
    return render_template('index.html')
# @app.route('/demo_ueditor')
# def demo_ueditor():
#     return render_template('demo_ueditor.html')

if __name__ == '__main__':
    app.run(port=9000,debug=True)

特殊强调:路径蓝图,必须指向ueditor(这个非常非常非常重要,否则前端会报错),放在app执行文件中

from ueditor import bp as ueditor_blue
app.register_blueprint(ueditor_blue)

5)最后整个工程文件树:

 

 希望你能最终实现,对你有用就点赞吧,以鼓励我继续津津乐道!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/930706.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pytest执行顺序,不要迷恋pytest-order

所以说pytest的执行顺序是默认编写的顺序来执行的 笔者在编写场景化测试用例时 test_违规告警_未报备空进重出.py 使用了order 序号1-12来进行排序 test_违规告警_未报备重进空出.py 使用了order 序号1-12来进行排序&#xff0c;执行时导致先会执行两个文件夹中order1的用例造成…

C语言练习3(巩固提升)

C语言练习3 选择题 选择题 前言 奋斗是曲折的&#xff0c;“为有牺牲多壮志&#xff0c;敢教日月换新天”&#xff0c;要奋斗就会有牺牲&#xff0c;我们要始终发扬大无畏精神和无私奉献精神。奋斗者是精神最为富足的人&#xff0c;也是最懂得幸福、最享受幸福的人。正如马克思…

2023科隆游戏展开幕~黑神话等多款国产游戏亮相

这是【游戏开发那些事】第62篇原创 科隆游戏展&#xff0c;全名科隆国际游戏娱乐展览会&#xff08;Gamescom&#xff09;&#xff0c;是世界上最大的电子游戏展览之一。由德国联邦协会互动娱乐软件&#xff08;BIU&#xff09;主办&#xff0c;每年在德国科隆举行&#xff0c;…

探讨uniapp的路由与页面栈及参数传递问题

1首先引入页面栈 框架以栈的形式管理当前所有页面&#xff0c; 当发生路由切换的时候&#xff0c;页面栈的表现如下&#xff1a; 页面的路由操作无非&#xff1a;初始化、打开新页面、页面重定向、页面返回、tab切换、重加载。 2页面路由 uni-app 有两种页面路由跳转方式&am…

Activity之间的数据传递方法汇总

在Activity间传递的数据一般比较简单&#xff0c;但是有时候实际开发中也会传一些比较复杂的数据&#xff0c;本节一起来学习更多Activity间数据的传递方法。 1、通过 Intent 传递 我们在进行 Activity 跳转时&#xff0c;是要有 Intent&#xff0c;此时 Intent 是可以携带数…

Ai.Fy - Text To Image——AIGC工具

Ai.Fy 是一个功能强大的 Unity 编辑器扩展,可将文本转换为图像、粗略草图转换为纹理、AI 深度图、概念设计、生成自动法线贴图和平滑贴图。 以下是生成的案例 无需注册,无需API密钥,无需定期付款,无订阅费,无额外费用,无限制,只需单击即可在我们的模型上进行易于使用的…

action和mutation之间的利用 代码解释

场景&#xff1a;购物车点击按钮 context.commit(‘changeCount’, { goodsNum, goodsId })解释这段代码 这段代码是在使用 Vuex 进行状态管理时常见的一种写法。下面对代码进行解释&#xff1a; context.commit 是 Vuex 中的一个方法&#xff0c;用于触发一个名为 changeC…

iconfont 图标在vue里的使用

刚好项目需要使用一个iconfont的图标&#xff0c;所以记录一下这个过程 1、iconfont-阿里巴巴矢量图标库 这个注册一个账号&#xff0c;以便后续使用下载代码时需要 2、寻找自己需要的图标 我主要是找两个图标 &#xff0c;一个加号&#xff0c;一个减号&#xff0c;分别加入到…

Python“牵手”阿里巴巴商品列表数据,关键词搜索阿里巴巴API接口数据,阿里巴巴API接口申请指南

阿里巴巴平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范&#xff0c;阿里巴巴API接口是指通过编程的方式&#xff0c;让开发者能够通过HTTP协议直接访问阿里巴巴平台的数据&#xff0c;包括商品信息、店铺信息、物流信息等&#xff0c;从而…

【AutoLayout案例05-横竖屏效果 Objective-C语言】

一、接下来,看看这个 我们一看这个效果,就知道需求了吧 需求是,无论在横屏、竖屏下: 1)首先,是不是有四个View啊 无论在横屏、竖屏、下,都有这么四个View吧 这四个View的高和宽,是什么, 相等的吧 这四个View的高和宽,是相等的 那么,既然这四个View的高和宽,是…

Webgis系统调试与发布

Webgis系统调试与发布 调试方法与技巧网站发布方法 调试方法与技巧 在Web开发中&#xff0c;程序调试方法与技巧是开发人员必须掌握的一个重要内容&#xff0c;非常关键。Leaflet开发其实就是HTMLJavaScript的Web开发&#xff0c;其调试方法与一般的Web开发相同。 Web开发调试…

基于JSP+Servlet+Mysql停车场管理系统(含实训报告)

TOC 一、系统介绍 项目类型&#xff1a;Java web项目 项目名称&#xff1a;基于JSPServlet的停车场管理系统 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 前端技术&#xff1a;HTML、CSS、JS、JQuery等技术 后端技术&#xff1a;JSP、Servlet、JDBC等技术…

Node.js+Vue家政服务保洁预约系统_ee587

各功能模块的设计也便于以后的系统升级和维护。该系统采用了软件组件化、精化体系结构、分离逻辑和数据等方法。首先&#xff0c;要掌握有关系统的基本理论&#xff0c;如 nodejs技术、 MySQL数据库等&#xff0c;并对其进行全面的分析。为了给系统打下坚实的技术基础&#xff…

硬核旗舰南卡OE CC开放式耳机发布,重新定义百元开放式耳机新标杆!

​随着现在健康意识的不断提高&#xff0c;人们对于日常用品的要求越来越高&#xff0c;在耳机市场中&#xff0c;健康因素也逐渐成为消费者所考虑的因素之一&#xff0c;入耳式耳机因为会引发中耳炎、耳膜炎等疾病&#xff0c;正在逐渐被开放式蓝牙耳机所取代&#xff0c;南卡…

C语言实例_文件内容加密与解密

一、加密解码功能介绍 1.1 加密解码的功能 文件内容需要加密与解密功能的原因主要有两个方面&#xff1a;保护数据安全和确保数据完整性。 &#xff08;1&#xff09;保护数据安全&#xff1a;加密可以将文件内容转化为不可读或难以理解的形式&#xff0c;防止未经授权的人员…

Redis7之介绍(一)

1. 是什么 Redis:REmote Dictionary Server(远程字典服务器&#xff09; Remote Dictionary Server( 远程字典服务)是完全开源的&#xff0c;使用ANSIC语言编写遵守BSD协议&#xff0c;是一个高性能的Key-Value数据库提供了丰富的数据结构&#xff0c;例如String、Hash、List、…

Leetcode76. 最小覆盖子串

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 。 注意&#xff1a; 对于 t 中重复字符&#xff0c;我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。如果…

亲测influxdb安装为window后台服务

InfluxDB 安装 64bit&#xff1a;https://dl.influxdata.com/influxdb/releases/influxdb-1.7.4_windows_amd64.zip 解压安装包 修改配置文件 [meta]# Where the metadata/raft database is storeddir "D:/influxdb/meta"...[data]# The directory where the TSM…

无涯教程-进程 - 信号(Signals)

信号是对进程的通知&#xff0c;指示事件的发生。信号也称为软件中断&#xff0c;无法预知其发生&#xff0c;因此也称为异步事件。 可以用数字或名称指定信号&#xff0c;通常信号名称以SIG开头。可用信号kill –l(列出信号名称为l)检查可用信号&#xff0c;如下所示- 无论何…