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); } } }
参数名称 | 参数名称 | 备注 |
---|---|---|
virtualPath | virtualPath | 删除时需要磁盘路径一起删除 |
参数名称 | 参数说明 | 备注 |
---|---|---|
status | 状态信息 | 200表示服务器请求成功 201表示服务器异常 |
msg | 服务器返回的提示信息 | 可以为null |
data | 服务器返回的业务数据 | 可以为null |
/** * 完成图片的删除操作 * URL: http://localhost:8091/file/deleteFile * 参数: virtualPath * 返回值: SysResult对象 */ @DeleteMapping("/deleteFile") public SysResult deleteFile(String virtualPath){ fileService.deleteFile(virtualPath); return SysResult.success(); }
//删除文件 需要文件全路径 @Override public void deleteFile(String virtualPath) { String localPath = rootDir + virtualPath; File file = new File(localPath); if(file.exists()){ //如果文件存在,则删除 file.delete(); } }
需求说明: 当用户完成图片上传之后 会根据网络地址访问图片,但是查找的图片一定存在于磁盘中.
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网络地址时,应该按照磁盘地址进行查找!
如何将网络地址转化为磁盘地址?
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。
如果网站将真实地址直接告知用户.导致整个服务器不安全. 所以需要采用代理的技术规避该问题.
- 反向代理服务器介于用户和目标服务器之间
- 用户从反向代理服务器获取资源, 用户以为反向代理服务器就是目标服务器.
- 用户不清楚真实的服务器到底是谁, 保护了真实服务器的信息. 也称之为 "服务器端代理"
正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
- 正向代理服务器介于客户端和原始服务器之间.
- 用户访问正向代理服务器,并且指定目标服务器地址.
- 服务器端不清楚到底是谁访问的,以为是正向代理服务器访问的. 保护了用户信息. 也称之为客户端代理.
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网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
- nginx是一块开源免费的 轻量级的反向代理服务器/web服务器.
- nginx并发能力强 理论值: 5万次/秒 实际值: 3万次/秒
tomcat: 150-220 —>1000个/秒 内存占用200M- nginx占用内存少 不超过2M
URL地址: http://nginx.org/en/download.html
说明:
1.nginx启动会占用80端口!!
2.nginx启动路径不要有中文/空格/特殊字符 底层开发语言:C语言访问测试:
说明: nginx的启动每次都会启动2个进程项.
主进程: 主要提供反向代理服务. 占用内存大的
守护进程: 防止主进程意外关闭. 占用内存小的
说明: nginx的命令需要在根目录中运行 nginx.exe 所在的路径就是根目录
命令:
1. 启动nginx start nginx
2. 重启nginx nginx -s reload
3. 关闭nginx nginx -s stop
http { #每个反向代理服务,就是一个server server { #nginx默认监听端口号 默认都是80 listen 80; #nginx要拦截的域名 server_name localhost; #拦截所有的请求 location / { # root 代表代理的是一个目录 root html; # 配置默认访问的首页 index index.html index.htm; } } }
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; } }
文件位置: C:\Windows\System32\drivers\etc
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
1.检查所有的sql中的表名是否存在大小写问题. 检查注解 检查Sql
2.根据码云 检查POM.xml文件内容
3.将项目打包 install 命令
4.前端项目打包
如果将上述的操作修改完成,之后需要将程序编译。如图所示
将编译之后的dist目录 复制到nginx的根目录中。
需求: 用户通过http://web.jt.com 访问 dist/index.html
#配置前端代理 server { listen 80; server_name web.jt.com; location / { root dist; index index.html; } }
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; } }
命令: java -jar 8091.jar
问题说明: 如果启动失败 检查pom.xml文件 或者使用我的jar包
#配置后端代理 server { listen 80; server_name manage.jt.com; location / { #proxy_pass 映射的是请求的地址 proxy_pass http://localhost:8091; } }
通过:http://manage.jt.com/itemCat/findItemCatList/3 测试后端域名是否可用