Java教程

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

本文主要是介绍【后端结合】新程序猿笔记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.浏览器地址测试

 2. 本地磁盘地址测试

2. 文件删除操作 

2.1 业务接口说明

  • 请求路径: http://localhost:8091/file/deleteFile
  • 请求类型: delete
  • 请求参数:
参数名称参数名称备注
virtualPathvirtualPath删除时需要磁盘路径一起删除
  • 返回值结果:
参数名称参数说明备注
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 反向代理特点 

  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

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

 

 

这篇关于【后端结合】新程序猿笔记Day17(后端项目发布)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!