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

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

JS和CSS的引入

bash 复制代码
<head>
    <th:block th:include="include :: summernote-css" />
</head>
<body>
	<th:block th:include="include :: summernote-js" />
</body>

HTML标签

重点:class="summernote" id="messageContent"

bash 复制代码
<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自带的播放器播放只有声音没画面!!!

bash 复制代码
$(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代码

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

bash 复制代码
	/**
     * 通用上传请求(多个)
     */
    @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());
        }
    }
相关推荐
Likeadust1 天前
国标GB28181设备管理软件EasyGBS国标GB28181视频平台:RTMP和GB28181两种视频上云协议的区别
音视频·视频·安防监控·视频监控
踏雪羽翼2 天前
android 使用MediaPlayer实现音乐播放--权限请求
android·音频·音乐权限·动态权限请求
郁大锤3 天前
linux alsa-lib snd_pcm_open函数源码分析(四)
linux·音频·pcm·源码分析·驱动·alsa
安全二次方security²4 天前
2024 RISC-V 中国峰会 演讲幻灯片和视频回放 均已公开
视频·risc-v·中国峰会·risc-v安全·ppt·2024
Garfield20057 天前
从H264视频中获取宽、高、帧率、比特率等属性信息
h.265·视频·h.264·解码
Winston Wood7 天前
一文了解Android中的AudioFlinger
android·音频
矢量赛奇7 天前
比ChatGPT更酷的AI工具
人工智能·ai·ai写作·视频
雷龙发展:Leah7 天前
离线语音识别自定义功能怎么用?
人工智能·音频·语音识别·信号处理·模块测试
蓝天居士15 天前
ES8388 —— 带耳机放大器的低功耗立体声音频编解码器(4)
嵌入式·音频·es8388