1.文件上传
1.1 完善文件上传机制
1). 校验文件上传的类型,jpg|png|gif
2).分目录存储 减少查找图片的时间
3).指定文件名称 减少重名
4).利用配置文件的方式动态完成赋值.
1.2 正则表达式
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。
常规操作: ^ 开头 $结尾
* 任意次 >=0.
+ >=1
? 0/1次
匹配固定次数 {n}
匹配固定次数 {n,} >=n次
匹配固定次数 {n,m} 并且 n<m 匹配的次数 >=n,<=m
. 任意的单个字符 除了回车/换行等
x|y 要么是x 要么是y
[a-zA-Z] 匹配的是字符的范围
( ) 内部包含了多种的匹配原则
其他详细的规则,参见百度百科
正则表达式
1.3 编辑properties配置文件
说明:由于文件上传的目录结构将来有可能变化,所以应该通过配置文件的形式动态取值.
#pro文件本身就是字符串信息, 同时注意不要添加多余的空格
image.localDir=E:/JT_IMAGE
image.urlPath=http://image.jt.com
1.3 编辑FileController
@Autowired
private FileService fileService;
/**
* 实现图片上传
* url地址:Request URL: http://localhost:8091/pic/upload
请求参数: uploadFile
返回值结果: FileImage
*/
@RequestMapping("/pic/upload")
public FileImage upload(MultipartFile uploadFile) {
return fileService.upload(uploadFile);
}
1.4 编辑FileService
@Service
@PropertySource(value="classpath:/properties/image.properties",encoding="UTF-8")
public class FileServiceImpl implements FileService {
@Value("${image.localDir}")
private String localDir; // = "E:/JT_IMAGE"; //磁盘路径根目录
@Value("${image.urlPath}")
private String urlPath; // = "http://image.jt.com"; //虚拟路径的根目录
/**
* 1.校验数据的有效性 上传的文件是图片
* 2.准备文件上传目录 分目录储存 按照时间维护划分 yyyy/MM/dd
* 3.防止文件重名操作 UUID.文件后缀
*
* 磁盘真实路径:
* E:\JT_IMAGE\2020\06\19\abc.png
*网络虚拟路径:
* http://image.jt.com\2020\06\19\abc.png
*/
@Override
public FileImage upload(MultipartFile uploadFile) {
//abc.jpg ABC.JPG
String fileName = uploadFile.getOriginalFilename();
//1.将所有的文件类型转化为小写
fileName = fileName.toLowerCase();
//2.利用正则表达式判断字符串类型是否属于图片
if(!fileName.matches("^.+\\.(jpg|png|gif)$")) {
return FileImage.fail();
}
//3.将当前时间转化为目录结构
String dateDir = new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
//拼接文件存储的本地路径 E:/JT_IMAGE/2020/06/19/
String realLocalDir = localDir + dateDir;
File fileDir = new File(realLocalDir);
if(!fileDir.exists()) {
//如果目录不存在,则创建目录
fileDir.mkdirs();
}
//4.防止文件重名 利用uuid.jpg的形式完成
String uuid = UUID.randomUUID().toString().replace("-", "");
//获取文件后缀
String fileType = fileName.substring(fileName.lastIndexOf("."));
String realFileName = uuid + fileType;
//5.准备文件存储对象
String realFilePath = realLocalDir + realFileName;
File imageFile = new File(realFilePath);
try {
//获取图片宽度和高度.
BufferedImage bufferedImage =
ImageIO.read(uploadFile.getInputStream());
int width = bufferedImage.getWidth();
int height = bufferedImage.getHeight();
//实现文件上传
uploadFile.transferTo(imageFile);
//定义虚拟路径
String realURl = urlPath + dateDir + realFileName;
return FileImage.success(realURl,width,height);
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
return FileImage.fail();
}
}
}
1.5 文件上传校验
2 Nginx
2.1 关于图片回显需求说明
1).虚拟地址:http://image.jt.com/2020/06/19/76bf92ab02ed4590b093e7c73d5460be.jpg
2).磁盘地址说明:E:\JT_IMAGE\2020\06\19/76bf92ab02ed4590b093e7c73d5460be.jpg
说明:用户通过浏览器通过虚拟地址,实现图片展现.
问题说明: 虚拟地址路径与磁盘地址的路径没有任何关系.所以暂时无法实现图片的回显.
2.2反向代理机制
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率.
反向代理是服务器端代理.保护服务器信息
2.3 正向代理机制
正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
核心: 客户端清楚的知道访问的服务器资源是谁?
类比:路由器.
正向代理是客户端代理,保护了真实的客户信息.
2.4 Nginx介绍
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
说明:
1.占用内存小 nginx服务启动之后 占用的内存空间不超过2M.
2.并发能力强 nginx并发能力大约3-5万/秒 tomcat服务器并发能力大约150-220之间
2.5 Nginx官网介绍
2.6 Nginx安装
说明: nginx安装路径 不要放到C盘中/路径中不要有中文+空格
1).nginx启动 以超级管理员的身份运行.exe文件.
2).Nginx校验 打开任务管理器 检查所有的服务信息.
3).通过浏览器校验 localhost:80
2.7 关于Nginx 80端口占用问题
如果80端口被占用,则需要释放80端口.
80端口被占用的解决方法
2.8 关于nginx进程项说明
说明:nginx启动时会开启2个进程项,
1).主进程 :主要提供反向代理服务的. 内存占用大的
2).守护进程: 防止主进程意外关闭的.
关闭nginx时,需要先关闭守护进程,之后关闭主进程.
2.8 nginx命令
说明:如果需要执行nginx的命令,则需要在nginx的根目录中执行
指令说明:
- start nginx 如果nginx配置文件有问题,也不会生成报错信息.
- nginx -s reload -s指令会生成报错信息.
- nginx -s stop
2.9 nginx反向代理机制
http {
#一个反向代理的配置
server {
#监听端口号信息,一般都是80
listen 80;
#网址中要拦截请求地址
server_name localhost;
# 反向代理的具体配置 / 代表拦截所有的路径信息
location / {
#root 关键字写法 代理的是目录结构
root html;
#index 关键字 系统默认跳转页面
index index.html index.htm;
}
}
}
2.10 实现图片服务器反向代理
目的: http://image.jt.com/2020/06/19/76bf92ab02ed4590b093e7c73d5460be.jpg
真实资源信息: E:\JT_IMAGE/2020/06/19/76bf92ab02ed4590b093e7c73d5460be.jpg
实现原理: 当用户通过http://image.jt.com的形式发起请求时,应该被nginx所拦截.之后开始进行反向代理.通过本地磁盘路径获取服务器信息.
nginx反向代理的配置
#1.配置图片服务器
server {
listen 80;
server_name image.jt.com;
location / {
root E:/JT_IMAGE;
}
}
2.11 HOSTS文件说明
说明:计算机中为了开发人员方法,在本机提供了hosts文件.该文件主要的作用 实现了IP地址与域名的映射.
注意事项: 该配置只有在本机有效.如果想让所有的用户通过域名访问,则必须购买域名.
hosts文件位置:
2.12 利用switchHosts修改hosts文件
修改hosts文件:
127.0.0.1 image.jt.com
127.0.0.1 manage.jt.com
127.0.0.1 www.jt.com
127.0.0.1 sso.jt.com
2.13 修改hosts权限问题
2.14 基于nginx实现图片反向代理
2.15 nginx注意事项
3.nginx高级应用
3.1nginx域名代理
说明: 要求用户通过http://manage.jt.com的方式访问http://localhost:8091服务器.
实现思路: 利用nginx的反向代理机制完成.
配置信息如下:
#2.域名代理 manage.jt.com转向localhost:8091
server {
listen 80;
server_name manage.jt.com;
location / {
#发起新的请求路径的
proxy_pass http://localhost:8091;
}
}
3.2nginx负载均衡
说明:根据nginx可以实现用户访问的负载均衡,目的提高服务端响应能力.
3.2.1 动态获取端口号
@RestController
public class PortController {
//需求说明:通过用户的请求,获取端口号信息
@Value("${server.port}") //将服务端口号 动态注入
private Integer port;
@RequestMapping("/getPort")
public String getPort() {
return "当前访问服务器的端口号:"+port;
}
}
3.2.2 如何同时启动多个服务器
问题说明:由于程序中配置了热部署,所以当程序修改完成之后,会重新部署.服务器重启.
解决方案: 可以暂时将程序的热部署关闭.
实现步骤:
分别将YML中的端口号,修改为8081/8082/8083 之后依次启动主启动类,即可启动三台tomcat服务器.!!!
3.2.3 负载均衡策略-轮询策略
说明:按照配置文件的顺序依次访问.
#2.域名代理 manage.jt.com转向localhost:8091
server {
listen 80;
server_name manage.jt.com;
location / {
#发起新的请求路径的
#proxy_pass http://localhost:8091;
proxy_pass http://jtWindows;
}
}
#配置tomcat服务器集群 upstream部署集群 默认采用轮询的算法
upstream jtWindows {
server localhost:8081;
server localhost:8082;
server localhost:8083;
}
3.2.3 负载均衡策略-权重策略
说明: 公司内部的服务器配置可能有高有低.应该让高性能的服务器多处理用户请求!!
#配置tomcat服务器集群 upstream部署集群 默认采用轮询的算法
#weight权重配置 权重越大,访问概率越高
upstream jtWindows {
server localhost:8081 weight=6;
server localhost:8082 weight=3;
server localhost:8083 weight=1;
}
3.2.4 负载均衡策略-IPHash策略
说明: 如果需要将用户与服务器进行绑定时,则可以使用iphash策略.
#配置tomcat服务器集群 upstream部署集群 默认采用轮询的算法
#weight权重配置 权重越大,访问概率越高
#ip_hash;优先级较高
upstream jtWindows {
ip_hash;
server localhost:8081 weight=6;
server localhost:8082 weight=3;
server localhost:8083 weight=1;
}
3.2.4 IPHash算法说明
说明:iphash是如何通过网址绑定同一台服务器访问呢???
4 作业
1.完成京淘后台
2.搭建nginx服务器.学习负载均衡
3.安装vmware虚拟机.