1. 文件上传操作
1.1 编辑FileService
package com.jt.service;
import com.jt.vo.ImageVO;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
@Service
public class FileServiceImpl implements FileService{
//定义文件的根目录
private String rootDir = "D:/project3/images";
//定义图片服务器网址
private String rootURl = "http://image.jt.com";
/**
* 思路:
* 1.校验文件是否为图片 校验图片类型
* 2.防止文件为恶意程序 木马.exe.jpg
* 3.分目录存储 按照时间维度划分
* 4.防止文件重名 UUID
*/
@Override
public ImageVO upload(MultipartFile file) {
//1.获取图片名称,全部转化为小写 abc.jpg
String fileName = file.getOriginalFilename().toLowerCase();
if(!fileName.matches("^.+\\.(jpg|png|gif)$")){
return null;
}
//2.通过校验宽度和高度判断是否为图片 bufferedImage图片包装对象
try {
BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
int width = bufferedImage.getWidth();
int height = bufferedImage.getHeight();
if(width == 0 || height == 0){
return null;
}
//3.实现分目录的存储
String datePath = new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
//D:/project3/images/2025/11/11/
String fileDir = rootDir + datePath;
File dirFile = new File(fileDir);
if(!dirFile.exists()){
dirFile.mkdirs();
}
//4.动态生成UUID
String UUID = java.util.UUID.randomUUID().toString();
int index = fileName.lastIndexOf(".");
String fileType = fileName.substring(index);
fileName = UUID+fileType;
//5.实现文件上传 准备文件的全路径
String path = fileDir + fileName;
file.transferTo(new File(path));
//6.准备ImageVO数据返回 /2021/11/11/uuid.jpg
//封装VO对象对象
String virtualPath = datePath + fileName;
//String urlPath = "https://img14.360buyimg.com/n0/jfs/t1/172855/37/23003/136174/61b053d3Eb780b286/448d26aa148e6ea7.jpg";
//按照要求封装图片网络地址
//http://image.jt.com/2021/11/11/uuid.jpg
String urlPath = rootURl + virtualPath;
System.out.println(urlPath);
ImageVO imageVO = new ImageVO(virtualPath,urlPath, fileName);
return imageVO;
} catch (IOException e) {
//一般条件下为了不影响代码结构,将检查异常,转化为运行时异常
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
1.2 文件上传代码测试
1.浏览器地址测试
2. 本地磁盘地址测试
2. 文件删除操作
2.1 业务接口说明
- 请求路径: http://localhost:8091/file/deleteFile
- 请求类型: delete
- 请求参数:
参数名称 | 参数名称 | 备注 |
---|---|---|
virtualPath | virtualPath | 删除时需要磁盘路径一起删除 |
- 返回值结果:
参数名称 | 参数说明 | 备注 |
---|---|---|
status | 状态信息 | 200表示服务器请求成功 201表示服务器异常 |
msg | 服务器返回的提示信息 | 可以为null |
data | 服务器返回的业务数据 | 可以为null |
前端请求参数说明:
2.2 编辑FileController
/**
* 完成图片的删除操作
* URL: http://localhost:8091/file/deleteFile
* 参数: virtualPath
* 返回值: SysResult对象
*/
@DeleteMapping("/deleteFile")
public SysResult deleteFile(String virtualPath){
fileService.deleteFile(virtualPath);
return SysResult.success();
}
2.3 编辑FileService
//删除文件 需要文件全路径
@Override
public void deleteFile(String virtualPath) {
String localPath = rootDir + virtualPath;
File file = new File(localPath);
if(file.exists()){ //如果文件存在,则删除
file.delete();
}
}
3. 反向代理
3.1 业务需求
需求说明: 当用户完成图片上传之后 会根据网络地址访问图片,但是查找的图片一定存在于磁盘中.
URL地址: http://image.jt.com/2021/12/16/f9981c76-e6a7-49fa-88d9-3be0851dbf50.jpg
磁盘地址: D:/project3/images/2021/12/16/f9981c76-e6a7-49fa-88d9-3be0851dbf50.jpg
技术难点:
1.当用户访问URL网络地址时,应该按照磁盘地址进行查找!
如何将网络地址转化为磁盘地址?
3.2 反向代理介绍
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。
3.2.1 知识铺垫
如果网站将真实地址直接告知用户.导致整个服务器不安全. 所以需要采用代理的技术规避该问题.
3.2.2 反向代理特点
- 反向代理服务器介于用户和目标服务器之间
- 用户从反向代理服务器获取资源, 用户以为反向代理服务器就是目标服务器.
- 用户不清楚真实的服务器到底是谁, 保护了真实服务器的信息. 也称之为 "服务器端代理"
3.2 正向代理介绍
3.2.1 正向代理介绍
正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
3.2.2 正向代理特点
- 正向代理服务器介于客户端和原始服务器之间.
- 用户访问正向代理服务器,并且指定目标服务器地址.
- 服务器端不清楚到底是谁访问的,以为是正向代理服务器访问的. 保护了用户信息. 也称之为客户端代理.
3.3 nginx
3.3.1 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网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
3.3.2 Nginx特点
- nginx是一块开源免费的 轻量级的反向代理服务器/web服务器.
- nginx并发能力强 理论值: 5万次/秒 实际值: 3万次/秒
tomcat: 150-220 —>1000个/秒 内存占用200M- nginx占用内存少 不超过2M
3.3.3 Nginx下载
URL地址: http://nginx.org/en/download.html
3.3.4 Nginx 安装和使用
说明:
1.nginx启动会占用80端口!!
2.nginx启动路径不要有中文/空格/特殊字符 底层开发语言:C语言访问测试:
3.3.5 关于nginx 80端占用问题说明
1.检查端口号占用
2.打开任务管理器
3.关于80端口 被PID=4占用说明
3.3.6 关于nginx 启动项说明
说明: nginx的启动每次都会启动2个进程项.
主进程: 主要提供反向代理服务. 占用内存大的
守护进程: 防止主进程意外关闭. 占用内存小的
3.3.7 nginx 命令(熟练掌握)
说明: nginx的命令需要在根目录中运行 nginx.exe 所在的路径就是根目录
命令:
1. 启动nginx start nginx
2. 重启nginx nginx -s reload
3. 关闭nginx nginx -s stop
3.4 Nginx反向代理机制
http {
#每个反向代理服务,就是一个server
server {
#nginx默认监听端口号 默认都是80
listen 80;
#nginx要拦截的域名
server_name localhost;
#拦截所有的请求
location / {
# root 代表代理的是一个目录
root html;
# 配置默认访问的首页
index index.html index.htm;
}
}
}
3.5 Nginx实现图片代理
URL地址: http://image.jt.com/2021/12/16/f9981c76-e6a7-49fa-88d9-3be0851dbf50.jpg
磁盘地址: D:/project3/images/2021/12/16/f9981c76-e6a7-49fa-88d9-3be0851dbf50.jpg
代理机制:
域名: http://image.jt.com:80
代理为:
D:/project3/images
配置图片代理:
#配置图片代理
server {
listen 80;
server_name image.jt.com;
location / {
root D:/project3/images;
}
}
编辑完成之后,重启nginx
3.6 图片回显流程图
3.7 修改hosts文件
文件位置: C:\Windows\System32\drivers\etc
3.7.1 检查是否只读
如果该文件为只读 应该去除只读选项
3.7.2 检查权限
3.7.3 修改hosts文件
127.0.0.1 localhost
127.0.0.1 image.jt.com
127.0.0.1 manage.jt.com
127.0.0.1 web.jt.com
4 项目发布准备
4.1 项目发布
1.检查所有的sql中的表名是否存在大小写问题. 检查注解 检查Sql
2.根据码云 检查POM.xml文件内容
3.将项目打包 install 命令
4.前端项目打包
检查是否生成dist目录
4.2 前端发布准备
1.修改main.js的路径
2.编辑AddItem.vue文件
3.将前端项目进行编译
如果将上述的操作修改完成,之后需要将程序编译。如图所示
4.3 前端项目发布
4.3.1 业务说明
将编译之后的dist目录 复制到nginx的根目录中。
4.3.2 前端项目发布
需求: 用户通过http://web.jt.com 访问 dist/index.html
#配置前端代理
server {
listen 80;
server_name web.jt.com;
location / {
root dist;
index index.html;
}
}
重启nginx
4.3.3 前端代码测试
4.4 后端项目发布
4.4.1 动态获取端口号
package com.jt.controller;
import com.jt.vo.SysResult;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@CrossOrigin
public class PortController {
//动态获取端口号
@Value("${server.port}")
private Integer port;
@GetMapping("/getPort")
public String getPort(){
return "当前端口号:"+port;
}
}
4.4.2 项目发布
命令: java -jar 8091.jar
问题说明: 如果启动失败 检查pom.xml文件 或者使用我的jar包
4.4.3 nginx完成后端发布
#配置后端代理
server {
listen 80;
server_name manage.jt.com;
location / {
#proxy_pass 映射的是请求的地址
proxy_pass http://localhost:8091;
}
}
4.4.4 后端项目测试
通过:http://manage.jt.com/itemCat/findItemCatList/3 测试后端域名是否可用