1. 實現文件上傳
1.1 爲屬性賦值
1.1.1 編輯pro配置文件
1.1.2 爲屬性賦值
1.1.3 重構FileService
package com.jt.service;
import com.jt.vo.ImageVO;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.datatransfer.FlavorEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
@Service
@PropertySource(value = "classpath:/properties/image.properties",
encoding = "UTF-8") //將配置文件導入容器
public class FileServiceImpl implements FileService{
@Value("${image.fileDir}")
private String fileDir; // = "D:/JT-SOFT/images";
@Value("${image.urlPath}")
private String urlPath; //設定域名地址
private static Set<String> typeSet = new HashSet<>();
static {
//利用配置文件動態將圖片類型獲取.
typeSet.add(".jpg");
typeSet.add(".png");
typeSet.add(".gif");
}
/**
* 業務邏輯:實現文件上傳
* 步驟:
* 1.校驗圖片的類型 jpg|png|gif.......
* 2.校驗文件是否爲惡意程序...
* 3.採用分目錄的結構進行存儲
* 4.避免文件重名 UUID
*
* 考題: UUID有多少種排列組合? 32位16進制數.... 0-9 A-F 2^4*32 2^128 hash碰撞
* hash取值有多少種可能性? 8位16進制數 2^32
*
* @param uploadFile
* @return
*/
@Override
public ImageVO upload(MultipartFile uploadFile){
//一. 校驗圖片類型 1.利用集合校驗 2.正則表達式
//1.1 獲取文件名稱 1.jpg 1.JPG
String fileName = uploadFile.getOriginalFilename();
fileName = fileName.toLowerCase();
int index = fileName.lastIndexOf(".");
//1.2 獲取下標 獲取文件後綴類型
String fileType = fileName.substring(index);
//1.3 判斷是否爲圖片類型
if(!typeSet.contains(fileType)){
return ImageVO.fail();
}
//二.如果是圖片 高度/寬度
//2.1將數據轉化爲圖片對象
try {
BufferedImage bufferedImage =
ImageIO.read(uploadFile.getInputStream());
int width = bufferedImage.getWidth();
int height = bufferedImage.getHeight();
if(width == 0 || height == 0){
return ImageVO.fail();
}
//三 實現分目錄存儲
//3.1按照/yyyy/MM/dd/的方式進行目錄劃分
String dateDir = new SimpleDateFormat("/yyyy/MM/dd/")
.format(new Date());
//D:/JT-SOFT/images/2020/12/1/
String fileDirPath = fileDir + dateDir;
File dirFile = new File(fileDirPath);
//3.2 創建目錄
if(!dirFile.exists()){
dirFile.mkdirs();
}
//四. 實現文件上傳 20-18-3.3
//4.1 準備文件名稱 UUID 522f88bb-33b2-11eb-93fb-00d861eaf238
String uuid = UUID.randomUUID()
.toString().replace("-", "");
//4.2 動態生成文件名稱 uuid.jpg
String uuidName = uuid + fileType;
//4.3 實現文件上傳 D:\JT-SOFT\images\2020\12\02\a.jpg
File realFile = new File(fileDirPath+uuidName);
uploadFile.transferTo(realFile);
//本地磁盤地址: D:\JT-SOFT\images\2020\12\02\a.jpg
//網絡訪問虛擬地址: http://image.jt.com\2020\12\02\a.jpg
String url = urlPath + dateDir + uuidName;
return ImageVO.success(url, width,height);
} catch (IOException e) {
e.printStackTrace();
return ImageVO.fail(); //報錯返回
}
}
}
1.1.4 代碼測試
1.上傳圖片之後 文件上傳的路徑.
2.將請求的前綴修改爲具體磁盤地址
切換前綴,檢查文件是否正常
2. 反向代理
2.1 反向代理概念
反向代理服務器位於用戶與目標服務器之間,但是對於用戶而言,反向代理服務器就相當於目標服務器,即用戶直接訪問反向代理服務器就可以獲得目標服務器的資源。同時,用戶不需要知道目標服務器的地址,也無須在用戶端作任何設定。反向代理服務器通常可用來作爲Web加速,即使用反向代理作爲Web服務器的前置機來降低網絡和服務器的負載,提高訪問效率。 [1]
特點:
1.反向代理服務器是位於用戶和目標服務器之間的.
2. 用戶以爲反向代理服務器就是真實的服務器. 用戶不知道真實的服務器到底是誰.
3. 反向代理服務器保護服務端信息,稱之爲服務器端代理.
代理存在的原因: 用戶由於某種原因無法直接訪問目標服務器,完成指定的功能.
2.2 正向代理
2.2.1 正向代理介紹
正向代理,意思是一個位於客戶端和原始服務器(origin server)之間的服務器,爲了從原始服務器取得內容,客戶端向代理髮送一個請求並指定目標(原始服務器),然後代理向原始服務器轉交請求並將獲得的內容返回給客戶端。客戶端才能使用正向代理。
特點:
1.代理服務器位於用戶與服務器之間
2.用戶請求時,非常明確目標服務器到底是誰. 服務器不清楚到底是誰訪問的我.以爲是代理服務器直接發起的請求.
3.正向代理服務器保護了用戶的信息,所以稱之爲客戶端代理.
2.2.2 關於代理總結
1.反向代理是服務器端代理. 只要用戶訪問服務器,其實都是反向代理機制. 實現業務調用
2.正向代理是客戶端代理.主要用戶上網就就使用正向代理 實現的是網絡通信頭 網穿工具 夜神模擬器/花生殼
2.3 Nginx
2.3.1 Nginx服務器介紹
2.3.2 nginx介紹
Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,在BSD-like 協議下發行。其特點是佔有內存少,併發能力強,事實上nginx的併發能力在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。
特點:
1.佔用內存少 2M tomcat啓動 200M左右
2.併發能力強 5萬/秒 實際2-4萬/秒
2.3.3 Nginx安裝使用
1).啓動Nginx nginx啓動會生成2個進程項
1.主進程 主要的作用是提供反向代理服務的. 在關閉主進程 內存大的
2.守護進程 防止主進程意外關閉的. 先關閉守護
2.3.4 Nginx命令
工作目錄說明: 要求在nginx.exe所在的根目錄中執行
1.啓動命令
start nginx Linux ./nginx
2.重名命令
nginx -s reload Linux: ./nginx -s reload
3.關閉命令
nginx -s stop Linux: ./nginx -s stop
2.3.5 Nginx反向代理原理
入門案例說明: http://localhost:80
2).配置項
http{
server { #服務1
listen 80;
server_name localhost;
location / {
#root html;
root D:/jt_images;
index index.html;
}
}
server { #服務1
listen 80;
server_name xxxxxx; #服務名稱不能重複
location / {
#root html;
root D:/jt_images;
index index.html;
}
}
}
2.4實現圖片回顯
2.4.1 需求
實現圖片地址的代理,將圖片地址轉向到具體的磁盤路徑.
URL地址: http://image.jt.com/2020/12/02/7d7179100d1e423abc2546e77743947c.png
本地磁盤地址: D:\JT-SOFT\images/2020/12/02/7d7179100d1e423abc2546e77743947c.png
2.4.2 配置nginx
2.4.3 圖片回顯的原理
2.4.4 編輯HOSTS文件
作用: 實現本地域名與IP地址的映射
路徑:
2.4.5 修改HOSTS文件
2.6 實現域名代理
2.6.1 需求說明
需求: 要求用戶通過 http://manage.jt.com 訪問localhost:8091的服務器.
實現方式: 利用反向代理機制實現
2.6.2 配置nginx
#2.配置後端服務器 manage.jt.com:80 localhost:8091
server {
listen 80;
server_name manage.jt.com;
location / {
#發起url請求地址
proxy_pass http://localhost:8091;
}
}
2.7 Nginx實現tomcat集羣部署
2.7.1 集羣搭建原理
2.7.2 動態展現端口號
2.7.3 項目打包
說明:由於需要準備3臺tomcat服務器. 所以端口號依次8081/8082/8083
3).上傳war包
4).項目運行
java -jar 8081.war
2.7 Nginx 負載均衡
2.7.1 輪詢策略
說明: 根據配置文件的順序,依次訪問服務器.
2.7.2 權重策略
說明: 讓性能更優的服務器處理更多的用戶請求.
2.7.3 IPHASH策略
需求: 需要將用戶與某臺服務器進行綁定.
原理:
缺點:
1. 容易造成負載不均現象.
2. 如果IP地址與用戶綁定在一起,如果tomcat服務器宕機,則直接影響用戶.
IPhash實用場景:一般進行壓力測試時使用.
2.8 Nginx 高級屬性
2.8.1 down屬性
說明:如果服務器宕機,則可以通過down屬性進行標識,被標識的服務器則不會再爲用戶提供支持.
2.8.2 backup 屬性
備用機的設定. 一般條件下備用機不幹活的,但是當主機遇忙時,或者主機宕機時,纔會訪問備用機.
2.8.3 tomcat服務器高可用
說明:如果人爲的添加down屬性 效率不高, 能否自動的檢測服務器是否宕機,如果宕機,能否自動的標識爲down.
3 作業
安裝遠程連接工具
url地址 : https://mobaxterm.mobatek.net/download-home-edition.html
實現遠程鏈接動態效果