summernote富文本批量上传音频,视频等附件

news2024/11/20 7:54:30

普通项目,HTML的summernote富文本批量上传音频,视频等附件(其他附件同理)

JS和CSS的引入

<head>
    <th:block th:include="include :: summernote-css" />
</head>
<body>
	<th:block th:include="include :: summernote-js" />
</body>

HTML标签

重点:class=“summernote” id=“messageContent”

<div class="col-sm-10">
     <input type="hidden" class="form-control" name="messageContent">
     <div class="summernote" id="messageContent"></div>
 </div>

JQ

入口:[‘custom’, [‘myAudio’,‘myVideo’]] // 添加自定义组,一个是音频示例,一个是视频示例
自带的图片(onImageUpload)上传也改成批量上传了.
注意:这里的视频格式只能用H264编码的,不然HTML自带的播放器播放只有声音没画面!!!

$(function() {
	$('.summernote').summernote({
		toolbar: [
			['cleaner',['cleaner']],
			['style', ['style']],
			['font', ['bold', 'underline', 'clear']],
			['fontsize', ['fontsize']],
			['color', ['color']],
			['para', ['ul', 'ol', 'paragraph']],
			['table', ['table']],
			['insert', ['link','unlink','picture']],
			['custom', ['myAudio','myVideo']] // 添加自定义组
		],
		buttons: {
			myAudio: function () {
				var ui = $.summernote.ui;
				var button = ui.button({
					contents: '<i class="fa fa-file-audio-o"></i>',
					tooltip: '音频',
					click: function () {
						// 显示文件选择器
						var input = $('<input>').attr('type', 'file').attr('accept', 'audio/mp3').attr('multiple', '').on('change', function(e) {
							var files = e.target.files;
							if (files) {
								var formData = new FormData();
								// 遍历文件列表,并将它们添加到FormData对象中
								$.each(files, function(index, file) {
									formData.append("files", file);
								});
								
								$.ajax({
									url: ctx + "common/uploads", // 您的上传端点
									type: 'POST',
									data: formData,
									processData: false,
									contentType: false,
									success: function(result) {
										if (result.code == web_status.SUCCESS) {
											var urls = result.urls.split(','); // 根据后端定义的分隔符拆分URL字符串
											// 在编辑器中插入每个图片
											$.each(urls, function(index, url) {
												$('#messageContent').summernote('pasteHTML', '<audio src="' + url + '" controls="controls"></audio>');
											});
										} else {
											$.modal.alertError(result.msg);
										}
									},
									error: function(xhr, status, error) {
										// 处理上传错误
										$.modal.alertWarning("音频上传失败。");
									}
								});
							}
						});
						// 触发文件选择器
						input.click();
					}
				 });
				 return button.render();
			 },
			myVideo: function () {
				var ui = $.summernote.ui;
				var button = ui.button({
					contents: '<i class="fa fa-file-video-o"></i>',
					tooltip: '视频',
					click: function () {
						// 显示文件选择器
						var input = $('<input>').attr('type', 'file').attr('accept', 'video/mp4').attr('multiple', '').on('change', function(e) {
							var files = e.target.files;
							if (files) {
								var formData = new FormData();
								// 遍历文件列表,并将它们添加到FormData对象中
								$.each(files, function(index, file) {
									formData.append("files", file);
								});
								
								$.ajax({
									url: ctx + "common/uploads", // 您的上传端点
									type: 'POST',
									data: formData,
									processData: false,
									contentType: false,
									success: function(result) {
										if (result.code == web_status.SUCCESS) {
											var urls = result.urls.split(','); // 根据后端定义的分隔符拆分URL字符串
											// 在编辑器中插入每个图片
											$.each(urls, function(index, url) {
												$('#messageContent').summernote('pasteHTML', '<div style="width: 320px; height: 240px;"> <video src="' + url + '" controls="controls"></video></div>');
											});
										} else {
											$.modal.alertError(result.msg);
										}
									},
									error: function(xhr, status, error) {
										// 处理上传错误
										$.modal.alertWarning("视频上传失败。");
									}
								});
							}
						});
						// 触发文件选择器
						input.click();
					}
				 });
				 return button.render();
			 }
		 },
		lang: 'zh-CN',
		dialogsInBody: true,
		callbacks: {
			onChange: function(contents, $edittable) {
				$("input[name='" + this.id + "']").val(contents);
			},
			onImageUpload: function(files) {
				var formData = new FormData();
				// 遍历文件列表,并将它们添加到FormData对象中
				$.each(files, function(index, file) {
					formData.append("files", file);
				});
				
				var obj = this;
				$.ajax({
					type: "post",
					url: ctx + "common/uploads",
					data: formData,
					cache: false,
					contentType: false,
					processData: false,
					dataType: 'json',
					success: function(result) {
						if (result.code == web_status.SUCCESS) {
							var urls = result.urls.split(','); // 根据后端定义的分隔符拆分URL字符串
							// 在编辑器中插入每个图片
							$.each(urls, function(index, url) {
								$('#' + obj.id).summernote('insertImage', url);
							});
						} else {
							$.modal.alertError(result.msg);
						}
					},
					error: function(error) {
						$.modal.alertWarning("图片上传失败。");
					}
				});
			}
		}
	});
});

后端Java代码

就是若依的通用上传请求(多个)代码

	/**
     * 通用上传请求(多个)
     */
    @PostMapping("/uploads")
    @ResponseBody
    public AjaxResult uploadFiles(List<MultipartFile> files) throws Exception
    {
        try
        {
            // 上传文件路径
            String filePath = RuoYiConfig.getUploadPath();
            List<String> urls = new ArrayList<String>();
            List<String> fileNames = new ArrayList<String>();
            List<String> newFileNames = new ArrayList<String>();
            List<String> originalFilenames = new ArrayList<String>();
            for (MultipartFile file : files)
            {
                // 上传并返回新文件名称
                String fileName = FileUploadUtils.upload(filePath, file);
                String url = serverConfig.getUrl() + fileName;
                urls.add(url);
                fileNames.add(fileName);
                newFileNames.add(FileUtils.getName(fileName));
                originalFilenames.add(file.getOriginalFilename());
            }
            AjaxResult ajax = AjaxResult.success();
            ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER));
            ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER));
            ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER));
            ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER));
            return ajax;
        }
        catch (Exception e)
        {
            return AjaxResult.error(e.getMessage());
        }
    }

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

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

相关文章

DataStream编程模型之数据源、数据转换、数据输出

Flink之DataStream数据源、数据转换、数据输出&#xff08;scala&#xff09; 0.前言–数据源 在进行数据转换之前&#xff0c;需要进行数据读取。 数据读取分为4大部分&#xff1a; &#xff08;1&#xff09;内置数据源&#xff1b; 又分为文件数据源&#xff1b; socket…

爬虫开发工具与环境搭建——使用Postman和浏览器开发者工具

第三节&#xff1a;使用Postman和浏览器开发者工具 在网络爬虫开发过程中&#xff0c;我们经常需要对HTTP请求进行测试、分析和调试。Postman和浏览器开发者工具&#xff08;特别是Network面板和Console面板&#xff09;是两种最常用的工具&#xff0c;能够帮助开发者有效地捕…

vue2侧边导航栏路由

<template><div><!-- :default-active"$route.path" 和index对应其路径 --><el-menu:default-active"active"class"el-menu-vertical-demo"background-color"#545c64"text-color"#fff"active-text-col…

时代变迁对传统机器人等方向课程的巨大撕裂

2020年之后&#xff0c;全面转型新质课程规划&#xff0c;传统课程规划全部转为经验。 农耕-代表性生产关系-封建分配制度主要生产力-人力工业-代表性生产关系-资本分配制度工业分为机械时代&#xff0c;电气时代&#xff0c;信息时代&#xff1b;主要生产力-人力转为人脑&…

JVM类加载过程-Loading

一、Class对象的生命周期 .class文件是如何加载到内存中:.class文件是ClassLoader通过IO将文件读到内存,再通过双亲委派的模式进行Loading,再Linking、以及Initializing,代码调用等一系列操作后,进行GC,组成完整的生命周期; 二、双亲委派模式(Loading的过程): 1、类…

BERT--公认的里程碑

前言 如果说&#xff0c;让我选Transformer架构的哪个模型最深入人心&#xff0c;我将毫不犹豫的选择BERT&#xff01; BERT 的意义在于&#xff0c;从大量无标记的数据集中训练得到的深度模型&#xff0c;可以限制提高各项自然语言处理任务的准确率。 BERT 在当时&#xff0…

<项目代码>YOLOv8 瞳孔识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

每日OJ题_牛客_天使果冻_递推_C++_Java

目录 牛客_天使果冻_递推 题目解析 C代码 Java代码 牛客_天使果冻_递推 天使果冻 描述&#xff1a; 有 n 个果冻排成一排。第 i 个果冻的美味度是 ai。 天使非常喜欢吃果冻&#xff0c;但她想把最好吃的果冻留到最后收藏。天使想知道前 x个果冻中&#xff0c;美味…

果韵 2.0.1| 听歌神器,双端支持,支持下载歌曲和歌词

果韵是一款支持Windows和安卓双端的音乐播放器&#xff0c;支持自定义音源&#xff0c;界面简洁。用户可以通过缓存下载歌曲和歌词。为了使用这些功能&#xff0c;需要先进行音源导入。通过设置中的存储设置&#xff0c;将缓存文件夹移动到download目录下&#xff0c;之后缓存的…

Allegro从.brd文件中导出器件ball map

Step 1&#xff08;可选&#xff09;&#xff1a;设置网络颜色 Step2&#xff1a;File->Export->Symbol Spreadsheet\ Step3&#xff1a;Primary text选择Net Name Step 4&#xff1a;在.brd所有文件夹下生成一个ball map文件&#xff0c;其中网络颜色与Step 1一致。ba…

Docker入门之Windows安装Docker初体验

在之前我们认识了docker的容器&#xff0c;了解了docker的相关概念&#xff1a;镜像&#xff0c;容器&#xff0c;仓库&#xff1a;面试官让你介绍一下docker&#xff0c;别再说不知道了 之后又带大家动手体验了一下docker从零开始玩转 Docker&#xff1a;一站式入门指南&#…

家庭网络常识:猫与路由器

这张图大家应该不陌生——以前家庭网络的连接方式。 图1 家庭网络连接示意图 来说说猫/光猫&#xff1a; 先看看两者的图片。 图2 猫 图3 光猫 这个东西因为英文叫“modem”&#xff0c;类似中文的“猫”&#xff0c;所以简称“猫”。 猫和光猫的区别就是&#xff0c;一…

三种复制只有阅读权限的飞书网络文档的方法

大家都知道&#xff0c;飞书是一款功能强大的在线协作工具&#xff0c;可以帮助团队更高效地协作和沟通。越来越多的资料都在使用飞书文档&#xff0c;在使用飞书的过程中&#xff0c;发现很多文档没有复制权限&#xff0c;如果想要摘抄笔记&#xff0c;只能一个字一个字地敲出…

elasticsearch的倒排索引是什么?

大家好&#xff0c;我是锋哥。今天分享关于【elasticsearch的倒排索引是什么&#xff1f;】面试题。希望对大家有帮助&#xff1b; elasticsearch的倒排索引是什么&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 倒排索引&#xff08;Inverted Index&a…

基于Java Springboot甘肃旅游管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

uniApp项目运行到鸿蒙手机,应用图标一直是H,应用名一直是HBuilder问题

项目运行到鸿蒙手机&#xff0c;应用图标一直是H,应用名一直是HBuilder问题 应用运行到鸿蒙手机和鸿蒙模拟器&#xff0c;应用图标一直是H,应用名一直是HBuilder&#xff0c;在自动生成的harmony-configs文件夹下也没有配置的文件&#xff0c; 这时候需要你将DevEco Studio 下…

Python3.11.9+selenium,获取图片验证码以及输入验证码数字

Python3.11.9+selenium,获取图片验证码以及输入验证码数字 1、遇到问题:登录或修改密码需要验证码 2、解决办法: 2.1、安装ddddocr pip install ddddocr 2.2、解析验证码函数 import ddddocr def get_capcha_text():#获取验证码图片ele_pic = driver.find_element(By.XPAT…

中伟视界:AI智能分析算法如何针对非煤矿山的特定需求,提供定制化的安全生产解决方案

非煤矿山智能化改造&#xff0c;除了政策文件&#xff0c;上级监管单位需要安装的AI智能分析算法功能之外的&#xff0c;矿方真正关心的&#xff0c;能解决矿方安全生产隐患的AI智能分析算法功能有哪些呢&#xff1f; 经过与矿方的现场交流沟通&#xff0c;收集第一现场人员对安…

【论文速读】| 迈向自动化渗透测试:引入大语言模型基准、分析与改进

基本信息 原文标题&#xff1a;Towards Automated Penetration Testing: Introducing LLM Benchmark, Analysis, and Improvements 原文作者&#xff1a;Isamu Isozaki, Manil Shrestha, Rick Console, Edward Kim 作者单位&#xff1a;Drexel University, Independent 关键…

【Visual Studio系列教程】如何在 VS 上编程?

上一篇博客中&#xff0c;我们介绍了《什么是 Visual Studio&#xff1f;》。本文&#xff0c;我们来看第2篇《如何在 VS 上编程&#xff1f;》。阅读本文大约10 分钟。我们会向文件中添加代码&#xff0c;了解 Visual Studio 编写、导航和了解代码的简便方法。 本文假定&…