分布式 03 富文本处理插件和图片文件上传

news2024/11/24 22:24:57

01.使用富文本编辑器来上传图片文件。
在这里插入图片描述
02.最开始在html文件中去使用相关富文本的插件。
引入相关文件

<link href="/js/kindeditor-4.1.10/themes/default/default.css" type="text/css" rel="stylesheet">
<script type="text/javascript" charset="utf-8" src="/js/kindeditor-4.1.10/kindeditor-all-min.js"></script>
<script type="text/javascript" charset="utf-8" src="/js/kindeditor-4.1.10/lang/zh_CN.js"></script>
<script type="text/javascript" charset="utf-8" src="/js/jquery-easyui-1.4.1/jquery.min.js"></script>

在这里插入图片描述

在js中使用富文本插件

<script type="text/javascript">
	$(function(){
		KindEditor.ready(function(){
			KindEditor.create("#editor")
		})
	})
</script>

由于在kindeditor-4.1.10,相关js文件已经声明了一个KindEditor变量,在html文件中去使用这个变量,就等于调用了KindEditor插件。

文件的上传:先使用简单的插件和专门的代码

<body>
	<h1>实现文件长传</h1>
	<!--enctype="开启多媒体标签"  -->
	<form action="http://localhost:8091/file" method="post" 
	enctype="multipart/form-data">
		<input name="fileImage" type="file" />
		<input type="submit" value="提交"/>
	</form>
</body>

创建controller

/*
* 需求:实现文件的上传,上传到D:/img/
* url:http://localhost:8091/file
* 参数:MultipartFile fileImage
* MultipartFile该接口:用来接收多媒体文件
1.2.4业务测试
说明:启动项目,然后打开浏览器,访问:localhost:8091/file.jsp,然后选中对应要提交的文件,进行提
交。提交完成之后打开对应的上传路径,查看是否有提交的资源,具体测试效果如下图所示:
2.使用富文本编辑器实现文件上传
* 返回值结果:String “文件上传成功”
* 注意事项:默认条件下,文件上传的大小不要超过1M
*/
@RestController
public class FileController {
	@RequestMapping("/file")
	public String file(MultipartFile fileImage) throws IllegalStateException, IOException {
		//第一步。文件上传目录结构
		String path="D:/imgs/";
		File file=new File(path);
		//判断file中的额文件路径是否存在
		if(!file.exists()) {//如果这个目录结构不存在的话,创建目录
			file.mkdirs();//多级目录
		}
		//2.获取文件名
		String filename=fileImage.getOriginalFilename();
		//3.拼接文件完整路径
		String filePath=path+filename;
		//4.传文件
		fileImage.transferTo(new File(filePath));
		return "文件上传成功";
	}

}

此时好需要注意到文件的回显,也就是在上传图片时候,在上传界面可以看到相关的图片。

package com.jt.vo;

import org.springframework.util.StringUtils;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class ImageVO {
	private  Integer   error;
	private  String url;
	private  Integer width;
	private  Integer height;
	
	
	public static ImageVO fail() {
		return new ImageVO(1,null,null,null);
	}
	public static ImageVO success(String url,Integer width,Integer height) {
		if(StringUtils.isEmpty(url) || width==null || height==null || width<0 || height<0) {
			return new ImageVO(1,null,null,null);
		}
		return new ImageVO(0,url,width,height);
	}
}

	@RequestMapping("/pic/upload")
	public ImageVO uploadFile(MultipartFile uploadfile)  {
		
		return fileService.uploadFile(uploadfile);
	}
public interface FileService {

	ImageVO uploadFile(MultipartFile uploadfile);

}

@Service
@PropertySource("classpath:/properties/image.properties")
public class FileServiceImpl implements FileService {
//4.设定本地存储的根目录
@Value("${image.localPath}")
private String localPath;
@Value("${image.urlPath}")
private String urlPath;//http://image.jt.com/
@Override
public ImageVO uploadImage(MultipartFile uploadFile) {
/**
* 1.校验是否为图片格式 jpg|png|gif|jpeg
* 2.判断是否为恶意程序,例如:木马.exe.jpg 宽度:? 高度:?
* 3.按照上传日期生成目录结构进行分目录存储,好处:可以更好地控制图片的数量
* 4.防止图片的重名,利用uuid随机生成图片的名称
*/
//1.需要获取图片的名称 XXX.jpg
String fileName = uploadFile.getOriginalFilename();
//2.利用正则表达式,判断是否为图片
if(!fileName.matches(".+(.png|.jpeg|.gif|.jpg)$")) {
//表示不是图片
return ImageVO.fail();
}
//3.判断是否为恶意程序
try {
3.反向代理
3.1反向代理概念
访问原理如图所示:
BufferedImage
bufferedImage=ImageIO.read(uploadFile.getInputStream());
int width = bufferedImage.getWidth();
int height = bufferedImage.getHeight();
if (width<=0 ||height <=0) {
//表示不是图片
return ImageVO.fail();
}
//5.实现分目录存储,按到上传的时间yyyy/MM/dd/
String datePath=new SimpleDateFormat("yyyy/MM/dd/").format(new
Date());
//5.1拼接本地存储目录 根目录/yyyy/MM/dd/
String fileLocalPath=localPath+datePath;
//5.2判断本地存储目录是否存在
File fileDir=new File(fileLocalPath);
if (!fileDir.exists()) {
//如果不存在,需要创建该目录结构
fileDir.mkdirs();
}
//6.防止图片重名,利用uuid生成图片的名称 uuid.jpg
String uuid=UUID.randomUUID().toString().replace("-", "");
//6.1获取图片的后缀
String fileType = fileName.substring(fileName.lastIndexOf("."));
//6.2拼接图片的名称
String readFileName=uuid+fileType;
//7.实现图片上传
//7.1拼接文件上传完整路径
String realFileName=fileLocalPath+readFileName;
uploadFile.transferTo(new File(realFileName));
//url:http://image.jt.com/yyyy/MM/dd/uuid.jpg
String url=urlPath+datePath+readFileName;
System.out.println(url);
return ImageVO.success(url, width, height);
} catch (IOException e) {
e.printStackTrace();
return ImageVO.fail();
}
}

同时在项目中去创建一个image.properties·

image.localPath=D:/JT_IMAGE/ 
image.urlPath=http://image.jt.com/

BufferedImage介绍:
image是一个抽象类,BufferedImage是其实现类,是一个带缓冲区图像类,主要作用是将一幅图片加载到
内存中(BufferedImage生成的图片在内存里有一个图像缓冲区,利用这个缓冲区我们可以很方便地操作这
个图片),提供获得绘图对象、图像缩放、选择图像平滑度等功能,通常用来做图片大小变换、图片变灰、设
置透明不透明等。
BufferedImage的操作
Java将一副图片加载到内存中的方法:
BufferedImage bufferedImage = ImageIO.read(new FileInputStream(filePath));

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

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

相关文章

Redis面试题(上)

1.什么是 Redis&#xff1f; Redis 是一种基于内存的数据库&#xff0c;对数据的读写操作都是在内存中完成&#xff0c;因此读写速度非常快&#xff0c;常用于缓存&#xff0c;消息队列、分布式锁等场景。 Redis 提供了多种数据类型来支持不同的业务场景&#xff0c;比如 Strin…

Python机器学习入门 -- 支持向量机学习笔记

文章目录 前言一、支持向量机简介二、支持向量机的数学原理1. 距离解算2. 目标函数3. 约束下的优化求解4. 软间隔优化5. 核函数变换 三、Python实现支持向量机1. 惩罚力度对比2. 高斯核函数3. 非线性SVM 总结 前言 大部分传统的机器学习算法都可以实现分类任务&#xff0c;但这…

干货丨你真的了解反应持续时间吗?

Hello&#xff0c;大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是喵君姐姐~ 在今天的推文里&#xff0c;要给大家分享的是一种灵活、免费的心理科学工具——反应持续时间&#xff0c;快来一起看看哦~ 01 导读 简单按键的反应持续时间是一种容易获得但未被充分利用…

C++相比于C语言增加的8个小特性(详解)

C相比于C语言增加的8个小特性&#xff08;详解&#xff09; 文章目录 C相比于C语言增加的8个小特性&#xff08;详解&#xff09;一、命名空间二、C输入和输出三、缺省参数四、函数重载五、引用六、内联函数七、auto关键字八、指针空值nullptr总结 一、命名空间 c的命名空间是…

从一到无穷大 #8 Arrow,Parquet and ORC

文章目录 引言ArrowParquetNested EncodingRepetition LevelsDefinition Levels 列化压缩 ORC 引言 以我的机器为例来做一个简单的计算&#xff1a; 执行cat /proc/cpuinfo |grep MHz|uniq可以看到目前机器中CPU频率&#xff0c;得到值 2494.140MHZ&#xff5e;2494140000HZ&…

【算法】——全排列算法讲解

前言&#xff1a; 今天&#xff0c;我给大家讲解的是关于全排列算。我会从三个方面去进行展开&#xff1a; 首先&#xff0c;我会给大家分析关于全排列算法的思想和定义&#xff1b;紧接着通过手动实现出一个全排列代码来带大家见见是怎么实现的&#xff1b;最后我会给出两道题…

ESP32单片机入门篇

目录 一、ESP32单片机的基本概念 1.双核架构 2. Wi-Fi和蓝牙功能 3. 集成多种外设 4. 支持多种操作系统 二、开发环境 1. Arduino IDE 2. ESP-IDF 三、开发语言 四、注意事项 五、代码例程 &#xff08;1&#xff09;点亮LED灯 1. 电路图 2. 代码 3. 代码注释 …

【精品】Java-Stream流详解

Java-Stream流详解 如何学会JDK8中的Stream流&#xff0c;用它来提高开发效率&#xff1f;创建不可变的集合&#xff08;Immutable 不可变的&#xff09;场景方法 初试 Stream 流Stream 流的思想Stream 流的作用Stream 流的使用步骤Stream 流的中间方法Stream 流的终结方法 如何…

STM32:利用PWM波控制飞盈电调过程和注意事项

STM32&#xff1a;利用PWM波控制电调过程和注意事项 在进行模型控制的过程中&#xff0c;如四旋翼无人机等&#xff0c;需要用到电机&#xff0c;这些电机需要通过电调来控制电机的转速。在电调模块中带有的说明书一般都是利用遥控器进行控制&#xff0c;有些情况需要自己通过…

【自然语言处理】【大模型】CodeGeeX:用于代码生成的多语言预训练模型

CodeGeeX&#xff1a;用于代码生成的多语言预训练模型 《CodeGeeX: A Pre-Trained Model for Code Generation with Multilingual Evaluations on HumanEval-X》 论文地址&#xff1a;https://arxiv.org/pdf/2303.17568.pdf 相关博客 【自然语言处理】【大模型】CodeGeeX&#…

二叉排序树

二叉排序树 文章目录 二叉排序树创建遍历删除完整代码 假如给你一个数列 (7, 3, 10, 12, 5, 1, 9)&#xff0c;要求能够高效的完成对数据的查询和添加。 使用数组 数组未排序&#xff1a; 优点&#xff1a;直接在数组尾添加&#xff0c;速度快。 缺点&#xff1a;查找速度慢. 数…

[图形学] 射线和线段之间的最小距离

1 说在前面 本文的主要内容来自于Unity引擎中Spline功能的一个函数&#xff0c;一开始我难以理解这几个向量运算的作用和几何意义&#xff0c;经过一番思考后总结如下&#xff1a; 该段代码实际上更像是两个直线之间寻找最短距离&#xff0c;然后判断该距离对应的点在其中一条…

STM32利用USB的HID与QT上位机通信

之前使用kingst的逻辑分析仪&#xff0c;打开上位机软件&#xff0c;插上带usb的硬件就可以通信&#xff0c;也不需要打开串口什么的&#xff0c;感觉很方便&#xff0c;于是借用一个周末研究下这个技术。本文主要是用于记录自己学习的过程&#xff0c;顺便分享下学习感悟。 首…

大数据周会-本周学习内容总结012

开会时间&#xff1a;2023.05.07 16:00 线下会议 目录 01【es数据同步至mysql】 1.1【在es中插入数据后能够同步到mysql中】 1.2【修改与删除es中的数据】 02【nifi】 2.1【Nifi的单机及分布式集群部署】 2.2【nifi集群&#xff0c;getFile简单使用nifi】 2.3【nifi使用…

如何利用Requestly提升前端开发与测试的效率,让你事半功倍?

痛点 前端测试 在进行前端页面开发或者测试的时候&#xff0c;我们会遇到这一类场景&#xff1a; 在开发阶段&#xff0c;前端想通过调用真实的接口返回响应在开发或者生产阶段需要验证前端页面的一些 异常场景 或者 临界值 时在测试阶段&#xff0c;想直接通过修改接口响应来…

Nuvoton NK-980IOT开发板 u-boot 编译

前言 最近搭建了 Nuvoton NK-980IOT开发板 的开发编译环境&#xff0c;记录一下 u-boot 的 编译流程 Nuvoton NK-980IOT开发板 资源还是比较的丰富的&#xff0c;可以用于 嵌入式Linux 或者 RT-Thread 的学习开发 开发板上电比较的容易&#xff0c;两根 USB 线即可&#xff0…

进程与线程(二)

进程同步、进程互斥 同步亦称直接制约关系&#xff0c;是指为完成某种任务而建立的两个或多个进程&#xff0c;这些进程因为需要在某些位置上协调它们的工作次序而产生的制约关系。进程间的直接制约关系就是源于他们之间的相互合作。 操作系统要提供“进程同步机制”来解决异…

Oracle的学习心得和知识总结(二十四)|Oracle数据库DBMS程序包解密方法及SQL Developer和Unwrapper的安装与使用

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

android 隐藏底部虚拟按键

方法一 滑动屏幕 可重新显示出来 protected void hideBottomUIMenu() { //隐藏虚拟按键&#xff0c;并且全屏 if (Build.VERSION.SDK_INT <11 && Build.VERSION.SDK_INT < 19) { // lower api View v this.getWindow().getDecorView(); v.setSyst…

大众软件组织人事地震:传董事会被裁,5000人的CARIAD何去何从?

作者 | 德新 编辑 | 王博 外媒Business Insider近日爆出一则重磅消息&#xff1a;大众汽车集团CEO Oliver Blume&#xff08;奥博穆&#xff09;有意裁掉旗下软件组织CARIAD的整个董事会。其影响的高层包括&#xff0c;CARIAD CEO Dirk Hilgenberg、CTO Lynn Longo&#xff0c;…