【富文本编辑器】简记功能:neditor上传操作时提交额外数据

news2024/12/25 0:29:35

目录

编辑器下载(本文使用版本v2.1.19)

功能需求

解决思路

相关代码

调用实例的html

neditor.config.js(搜索修改内容:/* 设置额外请求参数 */)

 完成,如有其它方法,欢迎一起讨论


编辑器下载(本文使用版本v2.1.19)

Releases · notadd/neditor · GitHub

功能需求

上传图片时需要提交参数:存储文件名的前缀名、存放目录名称

解决思路

neditor基于ueditor再次封装,查询文档(UEditor Docs)可通过ue.execCommand来设置额外的请求参数,通过neditor服务端配置文件neditor.service.js来对每个上传操作中将额外的请求参数加入到formData中,完成添加额外请求参数的需求。

相关代码

调用实例的html

<script type="text/javascript" charset="utf-8" src="/neditor-v2.1.19/neditor.config.js"></script>
<script type="text/javascript" charset="utf-8" src="/neditor-v2.1.19/neditor.api.js"></script>
<script type="text/javascript" charset="utf-8" src="/neditor-v2.1.19/neditor.service.js"></script>
<script type="text/javascript" charset="utf-8" src="/neditor-v2.1.19/neditor.parse.js"></script>
<form class="layui-form layui-form-pane" onsubmit="return false" lay-filter="FormFilter">
    <div class="layui-form-item layui-form-item-130">
        <div class="layui-inline input-label">产品描述1</div>
        <div class="layui-input-block">
            <textarea name="goods1_textarea" id="goods_textarea_editor" placeholder="请输入产品描述" lay-verify=""
                      autocomplete="off" class="layui-textarea"></textarea>
        </div>
    </div>
</form>
<script>
    layui.use(['form', 'layer'], function () {
        let form = layui.form, layer = layui.layer
        let ue = UE.getEditor('goods_textarea_editor', {
            initialFrameWidth: '100%'
        })
        // 设置额外请求参数
        ue.ready(function() {
           ue.execCommand('serverparam', {
                prefix: 'goods',
                dir: 'guangzhou'
            });
        });
    })
</script>

neditor.config.js(搜索修改内容:/* 设置额外请求参数 */)

/**
 * 自定义上传接口
 * 由于所有Neditor请求都通过editor对象的getActionUrl方法获取上传接口,可以直接通过复写这个方法实现自定义上传接口
 * @param {String} action 匹配neditor.config.js中配置的xxxActionName
 * @returns 返回自定义的上传接口
 */
UE.Editor.prototype._bkGetActionUrl = UE.Editor.prototype.getActionUrl;
UE.Editor.prototype.getActionUrl = function(action) {
    /* 按config中的xxxActionName返回对应的接口地址 */
    if (action == 'uploadimage' || action == 'uploadscrawl') {
        return 'http://a.b.com/upload.php';
    } else if (action == 'uploadvideo') {
        return 'http://a.b.com/video.php';
    } else {
        return this._bkGetActionUrl.call(this, action);
    }
}

/**
 * 图片上传service
 * @param {Object} context UploadImage对象 图片上传上下文
 * @param {Object} editor  编辑器对象
 * @returns imageUploadService 对象
 */
window.UEDITOR_CONFIG['imageUploadService'] = function(context, editor) {
    return {
        /** 
         * 触发fileQueued事件时执行
         * 当文件被加入队列以后触发,用来设置上传相关的数据 (比如: url和自定义参数)
         * @param {Object} file 当前选择的文件对象
         */
        setUploadData: function(file) {
            return file;
        },
        /**
         * 触发uploadBeforeSend事件时执行
         * 在文件上传之前触发,用来添加附带参数
         * @param {Object} object 当前上传对象
         * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数
         * @param {Object} headers 可以扩展此对象来控制上传头部
         * @returns 上传参数对象
         */
        setFormData: function(object, data, headers) {
            /* 设置额外请求参数 */
            let serverparam = editor.queryCommandValue('serverparam')
            if (JSON.stringify(serverparam) != "{}") {
                Object.assign(object, serverparam)
                Object.assign(data, serverparam)
            }
            return data;
        },
        /**
         * 触发startUpload事件时执行
         * 当开始上传流程时触发,用来设置Uploader配置项
         * @param {Object} uploader
         * @returns uploader
         */
        setUploaderOptions: function(uploader) {
            return uploader;
        },
        /**
         * 触发uploadSuccess事件时执行
         * 当文件上传成功时触发,可以在这里修改上传接口返回的response对象
         * @param {Object} res 上传接口返回的response
         * @returns {Boolean} 上传接口返回的response成功状态条件 (比如: res.code == 200)
         */
        getResponseSuccess: function(res) {
            return res.code == 200;
        },
        /* 指定上传接口返回的response中图片路径的字段,默认为 url
         * 如果图片路径字段不是res的属性,可以写成 对象.属性 的方式,例如:data.url 
         * */
        imageSrcField: 'data.url'
    }
};

/**
 * 视频上传service
 * @param {Object} context UploadVideo对象 视频上传上下文
 * @param {Object} editor  编辑器对象
 * @returns videoUploadService 对象
 */
window.UEDITOR_CONFIG['videoUploadService'] = function(context, editor) {
    return {
        /** 
         * 触发fileQueued事件时执行
         * 当文件被加入队列以后触发,用来设置上传相关的数据 (比如: url和自定义参数)
         * @param {Object} file 当前选择的文件对象
         */
        setUploadData: function(file) {
            return file;
        },
        /**
         * 触发uploadBeforeSend事件时执行
         * 在文件上传之前触发,用来添加附带参数
         * @param {Object} object 当前上传对象
         * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数
         * @param {Object} headers 可以扩展此对象来控制上传头部
         * @returns 上传参数对象
         */
        setFormData: function(object, data, headers) {
            /* 设置额外请求参数 */
            let serverparam = editor.queryCommandValue('serverparam')
            if (JSON.stringify(serverparam) != "{}") {
                Object.assign(object, serverparam)
                Object.assign(data, serverparam)
            }
            return data;
        },
        /**
         * 触发startUpload事件时执行
         * 当开始上传流程时触发,用来设置Uploader配置项
         * @param {Object} uploader
         * @returns uploader
         */
        setUploaderOptions: function(uploader) {
            return uploader;
        },
        /**
         * 触发uploadSuccess事件时执行
         * 当文件上传成功时触发,可以在这里修改上传接口返回的response对象
         * @param {Object} res 上传接口返回的response
         * @returns {Boolean} 上传接口返回的response成功状态条件 (比如: res.code == 200)
         */
        getResponseSuccess: function(res) {
            return res.code == 200;
        },
        /* 指定上传接口返回的response中视频路径的字段,默认为 url
         * 如果视频路径字段不是res的属性,可以写成 对象.属性 的方式,例如:data.url 
         * */
        videoSrcField: 'data.url'
    }
};

/**
 * 涂鸦上传service
 * @param {Object} context scrawlObj对象
 * @param {Object} editor  编辑器对象
 * @returns scrawlUploadService 对象
 */
window.UEDITOR_CONFIG['scrawlUploadService'] = function(context, editor) {
    return scrawlUploadService = {
        /**
         * 点击涂鸦模态框确认按钮时触发
         * 上传涂鸦图片
         * @param {Object} file 涂鸦canvas生成的图片
         * @param {Object} base64 涂鸦canvas生成的base64
         * @param {Function} success 上传成功回调函数,回传上传成功的response对象
         * @param {Function} fail 上传失败回调函数,回传上传失败的response对象
         */

        /**
         * 上传成功的response对象必须为以下两个属性赋值
         * 
         * 上传接口返回的response成功状态条件 {Boolean} (比如: res.code == 200)
         * res.responseSuccess = res.code == 200;
         * 
         * 指定上传接口返回的response中涂鸦图片路径的字段,默认为 url 
         * res.videoSrcField = 'url';
         */
        uploadScraw: function(file, base64, success, fail) {
            /* 模拟上传操作 */
            var formData = new FormData();
            formData.append('file', file, file.name);
            /* 设置额外请求参数 */
            let serverparam = editor.queryCommandValue('serverparam')
            if (JSON.stringify(serverparam) != "{}") {
                for (let key in serverparam) {
                    formData.append(key,serverparam[key])
                }
            }
            $.ajax({
                url: editor.getActionUrl(editor.getOpt('scrawlActionName')),
                type: 'POST',
                //ajax2.0可以不用设置请求头,但是jq帮我们自动设置了,这样的话需要我们自己取消掉
                contentType: false,
                //取消帮我们格式化数据,是什么就是什么
                processData: false,
                data: formData
            }).done(function(res) {
                // var res = JSON.parse(res);
                
                /* 上传接口返回的response成功状态条件 (比如: res.code == 200) */
                res.responseSuccess = res.code == 200;

                /* 指定上传接口返回的response中涂鸦图片路径的字段,默认为 url 
                 * 如果涂鸦图片路径字段不是res的属性,可以写成 对象.属性 的方式,例如:data.url
                 */
                res.scrawlSrcField = 'data.url';

                /* 上传成功 */
                success.call(context, res);
            }).fail(function(err) {
                /* 上传失败 */
                fail.call(context, err);
            });
        }
    }
}

/**
 * 附件上传service
 * @param {Object} context UploadFile对象 附件上传上下文
 * @param {Object} editor  编辑器对象
 * @returns fileUploadService 对象
 */
window.UEDITOR_CONFIG['fileUploadService'] = function(context, editor) {
    return {
        /** 
         * 触发fileQueued事件时执行
         * 当文件被加入队列以后触发,用来设置上传相关的数据 (比如: url和自定义参数)
         * @param {Object} file 当前选择的文件对象
         */
        setUploadData: function(file) {
            return file;
        },
        /**
         * 触发uploadBeforeSend事件时执行
         * 在文件上传之前触发,用来添加附带参数
         * @param {Object} object 当前上传对象
         * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数
         * @param {Object} headers 可以扩展此对象来控制上传头部
         * @returns 上传参数对象
         */
        setFormData: function(object, data, headers) {
            /* 设置额外请求参数 */
            let serverparam = editor.queryCommandValue('serverparam')
            if (JSON.stringify(serverparam) != "{}") {
                Object.assign(object, serverparam)
                Object.assign(data, serverparam)
            }
            return data;
        },
        /**
         * 触发startUpload事件时执行
         * 当开始上传流程时触发,用来设置Uploader配置项
         * @param {Object} uploader
         * @returns uploader
         */
        setUploaderOptions: function(uploader) {
            return uploader;
        },
        /**
         * 触发uploadSuccess事件时执行
         * 当文件上传成功时触发,可以在这里修改上传接口返回的response对象
         * @param {Object} res 上传接口返回的response
         * @returns {Boolean} 上传接口返回的response成功状态条件 (比如: res.code == 200)
         */
        getResponseSuccess: function(res) {
            return res.code == 200;
        },
        /* 指定上传接口返回的response中附件路径的字段,默认为 url
         * 如果附件路径字段不是res的属性,可以写成 对象.属性 的方式,例如:data.url 
         * */
        fileSrcField: 'data.url'
    }
};

 完成,如有其它方法,欢迎一起讨论

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

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

相关文章

使用 Fluent Bit 实现云边统一可观测性

本文基于 KubeSphere 可观测性与边缘计算负责人霍秉杰在北美 KubeCon 的 Co-located event Open Observability Day 闪电演讲的内容进行整理。 整理人&#xff1a;米开朗基杨、大飞哥 Fluent Operator 简介 2019 年 1 月 21 日&#xff0c;KubeSphere 社区为了满足以云原生的方…

NX上配置TLD的环境---对opencv的版本没有要求

一、TLD工程编译及运行 1.1 源码下载 网上的TLD有两个版本&#xff0c;一个是Zdenek Kalal自己使用matlabvs混合编程实现的&#xff0c;另外一个是 arthurv利用c和opencv实现的。 我利用的是arthurv版本的Tracking-Learning-Detection 连接&#xff1a;https://github.com/al…

基于Android平台的手机安全卫士的设计与实现

目 录 第1章 引言 1 1.1 研究背景及意义 1 1.2 安全软件的现状 1 1.3 本文主要工作 2 1.4 本文的组织结构 2 第2章 Android的相关技术介绍及分析 3 2.1 搭建Android开发环境 3 2.1.1 搭建Ubuntu系统下Java开发环境 3 2.1.2 搭建Ubuntu系统下Android开发环境 3 2.2 Android项目目…

「企企通」完成Pre-D轮融资,加速采购供应链工业软件和 SaaS 网络生态构建

企企通作为领先的采购供应链工业软件和SaaS生态平台&#xff0c;在一年内再次宣布获得Pre-D轮融资&#xff0c;全年合计融资额达数亿元人民币&#xff0c;目前还有意向投资机构在进行&#xff0c;并开始启动IPO的筹备工作。本轮投资由华映资本独家投资。华映资本是企企通C2轮融…

flutter系列之:flutter中的变形金刚Transform

文章目录简介Transform简介Transform的使用总结简介 虽然我们在开发APP的过程中是以功能为主&#xff0c;但是有时候为了美观或者其他的特殊的需求&#xff0c;需要对组件进行一些变换。在Flutter中这种变换就叫做Transform。 flutter的强大之处在于&#xff0c;可以对所有的…

IBM MQ 通道

一&#xff0c;定义 通道是分布式队列管理器在IBM MQ MQI 客户端和IBM MQ服务器之间或两个IBM MQ服务器之间使用的逻辑通信链接。 通道是提供从一个队列管理器到另一个队列管理器的通信路径的对象。通道在分布式队列中用于将消息从一个队列管理器移动到另一个队列管理器&#x…

计算机网络-应用层详解(持续更新中)

应用层概述 应用层是解决通过应用进程的交互来实现特定网络应用的问题。 应用层是计算机网络体系结构的最顶层&#xff0c;是设计和建立计算机网络的最终目的&#xff0c;也是计算机网络中发展最快的部分。 早期基于文本的应用&#xff08;电子邮件、远程登录、文件传输、新…

百度联合行业头部企业新发5个行业大模型,大模型产业落地路径愈发清晰

本文已在【飞桨PaddlePaddle】公众号平台发布&#xff0c;详情请戳链接&#xff1a;百度联合行业头部企业新发5个行业大模型&#xff0c;大模型产业落地路径愈发清晰 11月30日&#xff0c;由深度学习技术与应用国家工程研究中心主办、飞桨承办的WAVE SUMMIT2022深度学习开发者…

WLAN AP安全策略中WPA认证与WPA2认证的差异

一、安全策略WPA认证&#xff08;PSK认证TKIP加密&#xff09;的案例 组网需求&#xff1a; 设备作为FAT AP&#xff0c;为用户提供WLAN服务&#xff0c;用户可以搜索到名为huawei的无线网络&#xff0c;采用的安全策略为WPA-PSK认证TKIP加密的方式。 组网图如下&#xff1a;…

3 内存访问

内存访问 1 字的存储 寄存器中&#xff1a;16位寄存器存一个字。高8位放高位字节&#xff0c;低8位当低位字节。 内存中&#xff1a;内存单元是字节单元&#xff0c;一个字要用2个连续的内存单元保存。低位字节保存在低地址内存单元&#xff0c;高位字节保存在高地址内存单元…

vmware上的centos8没有网络

目录一、先了解虚拟机的三种网络模式二、目前的网络模式和网络状况三、 解决网络不可用问题一、先了解虚拟机的三种网络模式 虚拟机的三种网络模式 二、目前的网络模式和网络状况 我的虚拟机网络配置 我们要将虚拟机和本机在同一个局域网络里才能入网 进入cmd输入ipconfig…

Java多线程之常用的相关方法总结(线程停止、线程休眠、线程礼让、线程优先级、守护线程等等)

Java多线程之相关常用方法一、线程方法二、线程停止1、思路2、样例三、线程休眠&#xff08;sleep&#xff09;1、思路2、样例四、线程礼让&#xff08;yield&#xff09;1、思路2、样例五、线程强制执行&#xff08;join&#xff09;1、思路2、样例六、观测线程状态1、相关概念…

Mac配置python wind量化接口

首先Mac与Windows的wind配置完全不同&#xff1a; Windows&#xff1a;wind相对容易配置&#xff0c;直接用软件就可以点击并添加配置环境即可Mac配置如下 文章目录Mac上Wind的基本情况Mac配置python Wind量化接口1. 在App Store中下载并打开 “Wind App” 这个应用2. 配置pyt…

带有SPI接口的独立CAN控制器DP2515

DP2515是一款独立控制器局域网络&#xff08;Controller Area Network&#xff0c; CAN&#xff09;协议控制器&#xff0c;完全支持 CAN V2.0B 技术规范。该器件能发送和接收标准和扩展数据帧以及远程帧。 DP2515自带的两个验收屏蔽寄存器和六个验收滤波寄存器可以过滤掉不想要…

MySql使用MyCat分库分表(五)MyCat 管理及监控

视频学习地址&#xff1a;17-尚硅谷-垂直分库_哔哩哔哩_bilibili 笔记参考地址&#xff1a;MySQL 分库分表 | xustudyxus Blog (frxcat.fun) MyCat 管理 Mycat默认开通2个端口&#xff0c;可以在server.xml中进行修改。 8066 数据访问端口&#xff0c;即进行 DML 和 DDL 操…

Java搭建宝塔部署实战毕设项目SSM学生学籍管理系统源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套Java开发的毕设项目SSM学生学籍管理系统的源码&#xff0c;适合拿来做毕业设计的同学。可以下载来学习一下&#xff0c;本期把这套系统分享给大家。 技术架构 技术框架&#xff1a;ssm layui…

Kafka 数据重复怎么办?(案例)

一、前言 数据重复这个问题其实也是挺正常&#xff0c;全链路都有可能会导致数据重复。 通常&#xff0c;消息消费时候都会设置一定重试次数来避免网络波动造成的影响&#xff0c;同时带来副作用是可能出现消息重复。 整理下消息重复的几个场景&#xff1a; 生产端&#xff1…

Scanner、Random、stirng

API的使用 API : Application Programming Interface [应用程序编程接口] -> 帮助文档,词典 [对JDK的翻译文档][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aWo9KVNQ-1670235353300)(https://cdn.staticaly.com/gh/quinhua/picsmain/markdown/…

RabbitMQ发布确认高级

在生产环境中由于一些不明原因&#xff0c;导致 RabbitMQ 重启&#xff0c;在 RabbitMQ 重启期间生产者消息投递失败&#xff0c;导致消息丢失&#xff0c;需要手动处理和恢复。 在这样比较极端的情况&#xff0c;RabbitMQ 集群不可用的时候&#xff0c;无法投递的消息该如何处…

Chrome安装油猴插件详细教程

Chrome安装油猴插件详细教程 一、油猴安装方法 方法一&#xff1a;Google官方商店安装&#xff08;推荐&#xff0c;需要科学上网&#xff09; 方法二&#xff1a;本地安装&#xff08;无需科学上网&#xff0c;不会科学上网的适用&#xff09; 二、安装油猴插件 方法一&am…