【后端结合】新程序猿笔记Day17(后端项目发布)

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.浏览器地址测试

【后端结合】新程序猿笔记Day17(后端项目发布)

 2. 本地磁盘地址测试

【后端结合】新程序猿笔记Day17(后端项目发布)

2. 文件删除操作 

2.1 业务接口说明

  • 请求路径: http://localhost:8091/file/deleteFile
  • 请求类型: delete
  • 请求参数:
参数名称 参数名称 备注
virtualPath virtualPath 删除时需要磁盘路径一起删除
  • 返回值结果:
参数名称 参数说明 备注
status 状态信息 200表示服务器请求成功 201表示服务器异常
msg 服务器返回的提示信息 可以为null
data 服务器返回的业务数据 可以为null

 前端请求参数说明:

【后端结合】新程序猿笔记Day17(后端项目发布)

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 反向代理特点 

  1. 反向代理服务器介于用户和目标服务器之间
  2. 用户从反向代理服务器获取资源, 用户以为反向代理服务器就是目标服务器.
  3. 用户不清楚真实的服务器到底是谁, 保护了真实服务器的信息. 也称之为 "服务器端代理"

3.2 正向代理介绍 

3.2.1 正向代理介绍

正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。 

3.2.2 正向代理特点 

  1. 正向代理服务器介于客户端和原始服务器之间.
  2. 用户访问正向代理服务器,并且指定目标服务器地址.
  3. 服务器端不清楚到底是谁访问的,以为是正向代理服务器访问的. 保护了用户信息. 也称之为客户端代理.

 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特点 

  1. nginx是一块开源免费的 轻量级的反向代理服务器/web服务器.
  2. nginx并发能力强 理论值: 5万次/秒 实际值: 3万次/秒
    tomcat: 150-220 —>1000个/秒 内存占用200M
  3. nginx占用内存少 不超过2M

3.3.3 Nginx下载 

URL地址: http://nginx.org/en/download.html

【后端结合】新程序猿笔记Day17(后端项目发布)

3.3.4 Nginx 安装和使用 

说明:
1.nginx启动会占用80端口!!
2.nginx启动路径不要有中文/空格/特殊字符 底层开发语言:C语言

访问测试:

【后端结合】新程序猿笔记Day17(后端项目发布) 3.3.5 关于nginx 80端占用问题说明

1.检查端口号占用

【后端结合】新程序猿笔记Day17(后端项目发布)

 2.打开任务管理器

【后端结合】新程序猿笔记Day17(后端项目发布)

 3.关于80端口 被PID=4占用说明

【后端结合】新程序猿笔记Day17(后端项目发布)

 3.3.6 关于nginx 启动项说明

说明: nginx的启动每次都会启动2个进程项.
主进程: 主要提供反向代理服务. 占用内存大的
守护进程: 防止主进程意外关闭. 占用内存小的

【后端结合】新程序猿笔记Day17(后端项目发布) 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 图片回显流程图

【后端结合】新程序猿笔记Day17(后端项目发布)

3.7 修改hosts文件 

文件位置: C:\Windows\System32\drivers\etc

【后端结合】新程序猿笔记Day17(后端项目发布) 3.7.1 检查是否只读

 如果该文件为只读 应该去除只读选项

【后端结合】新程序猿笔记Day17(后端项目发布)

 3.7.2 检查权限

【后端结合】新程序猿笔记Day17(后端项目发布)

 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.前端项目打包

【后端结合】新程序猿笔记Day17(后端项目发布) 

 检查是否生成dist目录

【后端结合】新程序猿笔记Day17(后端项目发布)

 4.2 前端发布准备

1.修改main.js的路径

【后端结合】新程序猿笔记Day17(后端项目发布)

2.编辑AddItem.vue文件 

【后端结合】新程序猿笔记Day17(后端项目发布)

 3.将前端项目进行编译

如果将上述的操作修改完成,之后需要将程序编译。如图所示

【后端结合】新程序猿笔记Day17(后端项目发布) 4.3 前端项目发布

 4.3.1 业务说明

将编译之后的dist目录 复制到nginx的根目录中。

【后端结合】新程序猿笔记Day17(后端项目发布) 

 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 前端代码测试

【后端结合】新程序猿笔记Day17(后端项目发布)

 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包

【后端结合】新程序猿笔记Day17(后端项目发布) 

 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 测试后端域名是否可用

【后端结合】新程序猿笔记Day17(后端项目发布) 

 

上一篇:Spring Cloud 微服务二:API网关spring cloud zuul


下一篇:Java——RAF