1. 文件上传实现
1.1 编辑properties文件
1.2 动态为属性赋值
说明: 文件上传的完整代码 注意磁盘地址/URL地址的拼接 问题
@Service
@PropertySource("classpath:/image.properties") //动态导入pro配置文件
public class FileServiceImpl implements FileService{
//最优做法:应该使用配置文件动态的属性赋值!!!!
@Value("${file.localDirPath}")
private String localDirPath; // = "D:/images";
@Value("${file.preURLPath}")
private String preURLPath; // = "http://image.jt.com";
/**
* 1.验证上传的文件是图片! jpg|png|gif 采用正则的方式校验
* 2.防止恶意程序攻击, 验证图片是否有宽度和高度.
* 3.文件分目录存储 例如: /2021/11/11
* 例如2: hash码 8位hash xx/xx/xx/xx
* 数据hahs时 特征:因为是算法 可能造成数据分配不均!!!
* 4.防止文件重名,修改文件名称 UUID
* @param file
* @return
*/
@Override
public ImageVO upload(MultipartFile file) {
//1.校验图片类型是否正确 正则表达式 a.jpg
//1.1 获取文件名称
String fileName = file.getOriginalFilename();
//1.3将名称全部小写
fileName = fileName.toLowerCase();
//1.2 正则校验 bug!!!!
if(!fileName.matches("^.+\\.(jpg|png|gif)$")){
//如果文件不是图片 则返回null
return null;
}
//2.判断是否为恶意程序
//2.1 通过图片对象 获取宽度和高度
try {
BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
int height = bufferedImage.getHeight();
int width = bufferedImage.getWidth();
if(height==0 || width==0){
return null;
} //3实现分目录存储
//3.1 按照时间将分配目录 /yyyy/MM/dd/
String dateDirPath = new SimpleDateFormat("/yyyy/MM/dd/")
.format(new Date());
//3.2 "D:/images/yyyy/MM/dd/
String localDir = localDirPath + dateDirPath;
File dirFile = new File(localDir);
if(!dirFile.exists()){//如果目录不存在,则创建目录
dirFile.mkdirs();
}
//4. 防止文件重名 生成UUID.文件类型
String uuid = UUID.randomUUID().toString()
.replace("-","");
int index = fileName.lastIndexOf(".");
//获取后缀 .jpg abc.jpg
String fileType = fileName.substring(index); //从给定的位置开始 向后截取数据
String realFileName = uuid + fileType;
//5.实现文件上传
// 5.1 拼接文件全路径 目录/文件名称
String localFilePath = localDir + realFileName;
// 5.2 完成文件上传
file.transferTo(new File(localFilePath));
/**封装返回值.
* 不带磁盘的本地存储路径 虚拟动态目录
* D:\images\2021\07\13\8b7b3ef3c88845a6876371b4815244ca.jpg
*/
String virtualPath = dateDirPath + realFileName;
//动态拼接网络访问地址
//图片访问网络地址: http://image.jt.com(域名)/2021/07/13/85a.jpg(动态路径)
//真实的磁盘地址: D:/images/2021/07/13/85a.jpg
String urlPath = preURLPath + virtualPath;
ImageVO imageVO = new ImageVO(virtualPath,urlPath,realFileName);
System.out.println(imageVO);
return imageVO;
} catch (IOException e) {
e.printStackTrace();
//终止程序
return null;
}
}
}
1.3 图片删除
1.3.1 业务接口文档
1.3.2 检查VUE.js
1.3.3 编辑FileController
/**
* 实现文件删除操作
* URL地址: /file/deleteFile
* 参数: virtualPath 虚拟路径
* 返回值: SysResult对象
*/
@DeleteMapping("/deleteFile")
public SysResult deleteFile(String virtualPath){
fileService.deleteFile(virtualPath);
return SysResult.success();
}
1.3.4 编辑FileService
//删除文件 1.准备文件全路径 2.执行删除操作
@Override
public void deleteFile(String virtualPath) {
// D:/images/yyyy/MM/dd/uuid.jpg
String path = localDirPath + virtualPath;
File file = new File(path);
//实现文件删除操作
file.delete();
}
2. Nginx
2.1 反向代理机制
2.1.1 反向代理介绍
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率.
特点:
- 反向代理服务器 介于用户与目标服务器之间 (3个组成部分)
- 用户以为反向代理服务器就是目标服务器.
- 用户不清楚真是的目标服务器地址.
2.1.2 反向代理机制
步骤:
核心知识: 用户出于某种原因 无法直接访问服务器.所以采用代理机制
- 用户向代理服务器发送请求,(以为代理服务器就是真实目标服务器)
- 代理服务器接收请求时,根据自己的映射文件,重新发起新的请求 访问真实的目标服务器.
- 根据映射路径,查找真实的服务器资源.
- 获取资源返回给代理服务器.
- 代理服务器将资源交换给用户.
2.2 正向代理机制
2.2.1 正向代理
正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
特点:
1.正向代理介于用户与目标服务器之间.
2.用户非常清楚的知道自己访问的远程资源到底是谁.
3.一般采用正向代理时 都是为了实现网络的通信.
2.2.2 正向代理解析
2.2 Nginx介绍
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
总结: Nginx是一个主流的 反向代理服务器/负载均衡服务器.
特点:
1.占用内存少 启动一个服务运行内存不超过2M 开发语言: C语言
2.并发能力强 官方测试数据 5万/秒并发能力 实测: 2-3万/秒
科普: 单台tomcat服务器并发能力 220/秒 JVM调优 增大JVM运行内存空间
配合服务器监控.根据当前硬件设备进行优化. 经过JVM调优之后的tomcat服务器 可以达到 1000/秒
2.3 Nginx安装
2.3.1 Nginx下载
注意事项: nginx底层开发由C语言完成的. 所以要求不要有中文目录/空格/特殊字符 (程序员操守)
2.3.2 Nginx解压
nginx启动时会占用80端口.
单击运行访问: localhost:80 效果如图
2.4 Nginx关于进程项说明
注意事项: 每次Nginx启动都会启动2个进程,如果重复启动则进程项会有多个.但是其它的进程不起作用 容易混淆.
关于进程项说明:
- 主进程: 主要提供反向代理服务 内存占用大的
- 守护进程: 防止主进程意外关闭的. 内存占用小的
先关闭守护再关闭主进程.
2.5 nginx命令
说明: nginx命令执行需要在nginx.exe的根目录中完成
启动nginx start nginx 则负责启动nginx服务器,至于报错不提示
重启nginx nginx -s reload 检查程序是否正确,有报错提示.
停止nginx nginx -s stop
2.6 反向代理入门案例
2.6.1 nginx配置文件位置
2.6.2 编辑nginx配置文件
#每个反向代理服务都是一个server
server {
#监听端口号 一般默认都是80
listen 80;
#拦截用户访问的路径
server_name localhost;
#反向代理配置 / 拦截所有请求
location / {
#root关键字 代表的是一个目录
root html;
#index关键字 默认的欢迎页面
index index.html index.htm;
}
}
2.7 业务说明
2.7.1 图片代理说明
1.用户URL地址 http://image.jt.com/2021/07/13/2baf5a45be974e8897130a8ea89e1178.jpg
2.文件磁盘地址 D:/images/2021/07/13/2baf5a45be974e8897130a8ea89e1178.jpg
原因: 远程URL地址与本地的磁盘地址不能映射.
解决方案: 用户访问http://image.jt.com 应该到D:/images
2.7.2 修改nginx配置项
说明: 修改之后需要重启nginx服务器.
#配置图片反向代理 1.注意位置 2.注意语法
server {
listen 80;
server_name image.jt.com;
location / {
root D:/images;
}
}
2.7.3 HOSTS文件
作用: 主要在本机实现 域名与IP的映射.
文件位置:
图片回显的工作原理
说明: hosts文件修改提示权限不足 按照 问题集中的描述 获取权限.
提示: 127.0.0.1 image.jt.com 重启nginx之后 重新上传图片检查是否正常回显
hosts配置/nignx.conf配置参见码云信息: