京淘实训Day10-文件上传-nginx

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官网介绍

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的根目录中执行
指令说明:

  1. start nginx 如果nginx配置文件有问题,也不会生成报错信息.
  2. nginx -s reload -s指令会生成报错信息.
  3. 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虚拟机.

猜你喜欢

转载自blog.csdn.net/qq_16804847/article/details/106849955
今日推荐