關于商品新增檔案子產品說明
- 使用者點選添加商品按鈕時,首先擷取分類三級清單資訊,跳轉到商品新增頁面
- 使用者登入基本的商品資訊
- 使用者錄入價格時,需要再後期将資料擴大100倍
商品上傳
- 當使用者點選上傳圖檔時,根據屬性名稱file=“圖檔位元組資訊“,實作資料的傳遞。
- 後端通過特定的接口MultipartFile(mvc專門接收位元組資訊,内部封裝io流)
- 上傳檔案時,首先正規表達式判斷檔案類型 .jpg.png.git
- 要判斷圖檔是否為木馬病毒,對于圖檔 ImageIO.read(file.getInputStream()) 進行高和寬的判斷,如果有一個為0則上傳的不是圖檔。
- 将上傳的圖檔進行分目錄存儲,采取政策按照時間日期進行的目錄分割
- 為了防止檔案命名重複,采用UUid的方式重新定義檔案名稱
- 最終實作檔案上傳,傳回特定的vo資料 供前端展現
商品詳情
- 通常商品資訊和詳情資訊是分開維護的.由于商品詳情是大字段(文本域),查詢的效率低.
- 商品表與詳情表是一對一的對應關系. 設計時 item.id=itemDesc.id.
- 之後利用富文本編輯器(所見即所得),展現詳情資訊,其中存儲的是html代碼片段.
@Service
public class FileServiceImpl implements FileService{
//封裝路徑的字首
private String localDir = "G:/images";
private String preUrl = "http://image.jt.com";
/**
* 完成校驗:
* 1.校驗是否為圖檔
* 2.木馬.exe.jpg 判斷是否滿足圖檔固有屬性 高度/寬度
* 3.為了提高查詢效率,要求分目錄存儲.
* 3.1 按照字尾名配置設定 jpg,png,gif 效率提升不能滿足要求
* 3.2 按照日期分 yyyy/MM/dd/HH 可以
* 3.3 商品分類 出現分布不均現象.
* 3.4 根據名稱hash 之後截串
* demo: hash(a)=qw|er|as|dg/a.jpg
* 弊端: hash碼可能出現分布不均的現象.
* 4.防止檔案重名 使用uuid代替名稱
* @param file
* @return
*/
@Override
public ImageVO upload(MultipartFile file) {
//1.擷取圖檔名稱 demo: abc.jpg abc.JPG
String fileName = file.getOriginalFilename();
//bug說明: 由于windows系統不區分大小寫,是以将字母全部轉化為小寫
fileName = fileName.toLowerCase();
//利用正則判斷是否為圖檔.
if(!fileName.matches("^.+\\.(jpg|png|gif)$")){
//如果不是圖檔,則傳回null
return null;
}
//2.檢查檔案是否為惡意程式.
try {
BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
int width = bufferedImage.getWidth();
int height = bufferedImage.getHeight();
if(width == 0 || height == 0){
//說明檔案不是圖檔.
return null;
}
//3.根據時間實作目錄的建立 時間--yyyy/MM/dd
String dateDir = new SimpleDateFormat("/yyyy/MM/dd/")
.format(new Date());
// "G:/images/2021/11/11
String localDirPath = localDir + dateDir;
//建立目錄
File dirFile = new File(localDirPath);
if(!dirFile.exists()){
dirFile.mkdirs();
}
//4. 使用uuid替換檔案名稱 唯一:系統内部唯一
String uuid = UUID.randomUUID().toString()
.replace("-","");
//截取檔案的字尾 aa.bb.cc.jpg
int index = fileName.lastIndexOf(".");
//擷取類型 .jpg
String fileType = fileName.substring(index);
String newFileName = uuid + fileType;
//5.實作檔案上傳操作 目錄/檔案名稱
String realFilePath = localDirPath + newFileName;
file.transferTo(new File(realFilePath));
System.out.println("檔案上傳成功!!!");
/*
* 6.封裝傳回值
* 封裝虛拟路徑 在各個系統之間可以靈活切換,隻儲存動态變化的目錄
* path = 時間/uuid.type
* 網絡位址://http://image.jt.com/2021/11/11/a.jpg
*/
String virtualPath = dateDir + newFileName;
String url = preUrl + virtualPath;
System.out.println("磁盤位址:"+realFilePath);
System.out.println("網絡位址:"+url);
return new ImageVO(virtualPath,url,newFileName);
} catch (IOException e) {
e.printStackTrace();
return null; //表示程式有問題
}
}
/**
* 實作思路:
* 1.根據虛拟位址,拼接磁盤位址
* 2.判斷檔案是否存在
* 3.實作檔案删除
* @param virtualPath
*/
@Override
public void deleteFile(String virtualPath) {
//1.生成本地磁盤位址
String path = localDir + virtualPath;
System.out.println(path);
File file = new File(path);
if(file.exists()){
file.delete();
}
}
}
如果路徑資訊會發生變化,則最好的方式通過動态指派的方式完成.
編輯image.properties檔案
#通過配置檔案 動态指派
image.localDir=G:/images
image.preUrl=http://image.jt.com
代理機制
使用者如果直接通過網絡位址進行通路,是無法直接擷取圖檔資訊的,如果需要擷取圖檔應該實作域名與位址的映射
反向代理:
- 反向代理伺服器位于使用者和伺服器之間
- 使用者通路反向代理伺服器,就可以擷取真實的資源
- 反向代理機制,使用者無需了解真實的伺服器資訊
- 反向代理保護了伺服器端資訊,也稱之為伺服器代理
正向代理:
1.正向代理伺服器位于使用者和伺服器之間.
2. 使用者發起請求時,非常明确自己通路的伺服器到底是誰
3. 真實的伺服器不清楚真實的使用者是誰.保護了使用者的資訊.
是以稱之為用戶端代理.
:使用者每一次請求都包含了正向代理和反向代理.
正向代理一般适用于網絡的通信.
反向代理一般适用于伺服器擷取資訊.
Nginx介紹
Nginx (engine x) 是一個高性能的HTTP和反向代理web伺服器,俄羅斯
- Nginx是非常優秀的反向代理伺服器
- Nginx占用記憶體小,不到2M tomcat伺服器占用記憶體200M左右
- 并發負載能力強3-5萬次每秒,tomcat并發能力250-500次每秒,進行調優可以實作1000次每秒
- nignx可以當作負載均衡伺服器使用
Nginx官網下載下傳
nginx啟動時會預設占用80端口
啟動關閉
關于啟動2項說明:
在windows中nginx服務每次點選啟動之後,都會生成2個程序項
程序項1: nginx主要程序資訊.
程序項2: nginx的守護程序 主要的任務防止主程序意外關閉.
關閉nginx 應該先關閉守護(記憶體曉得)再關閉主程序(記憶體大的).
指令:
1. 啟動指令 start nginx
2. 重新開機指令 nginx -s reload
3. 關閉指令 nginx -s stop
業務說明
磁盤位址:G:/images/2021/09/09/a.jpg
網絡位址:http://image.jt.com/2021/09/09/a.jpg
問題: 如何通過網絡位址通路磁盤的圖檔?
1.使用者通過域名通路真實的伺服器.
2.nginx根據自身的配置進行攔截,根據配置檔案将域名http://image.jt.com轉化為具體的磁盤位址
3.根據磁盤位址通路真實的伺服器資源.
4/5. 伺服器将資料交給nginx,之後nginx将資料傳回給使用者.至此實作了反向代理.
修改hosts檔案
路徑: C:\Windows\System32\drivers\etc
# IP 與 域名映射
# 127.0.0.1 localhost
# ::1 localhost
#圖檔伺服器配置
127.0.0.1 image.jt.com
#前端伺服器配置
127.0.0.1 www.jt.com
#後端伺服器配置
127.0.0.1 manage.jt.com