文件上传实现 和Nginx安装

1. 文件上传实现

1.1 编辑properties文件

在这里插入图片描述

1.2 动态为属性赋值

说明: 文件上传的完整代码 注意磁盘地址/URL地址的拼接 问题

@Service
@PropertySource("classpath:/image.properties") //动态导入pro配置文件
public class FileServiceImpl implements FileService{
    //最优做法:应该使用配置文件动态的属性赋值!!!!
    @Value("${file.localDirPath}")
    private String localDirPath;    // = "D:/images";
    @Value("${file.preURLPath}")
    private String preURLPath;      // = "http://image.jt.com";

    /**
     * 1.验证上传的文件是图片!  jpg|png|gif  采用正则的方式校验
     * 2.防止恶意程序攻击,  验证图片是否有宽度和高度.
     * 3.文件分目录存储     例如: /2021/11/11
     *                    例如2: hash码 8位hash xx/xx/xx/xx
     *  数据hahs时 特征:因为是算法 可能造成数据分配不均!!!
     * 4.防止文件重名,修改文件名称 UUID
     * @param file
     * @return
     */
    @Override
    public ImageVO upload(MultipartFile file) {
        //1.校验图片类型是否正确   正则表达式 a.jpg
        //1.1 获取文件名称
        String fileName = file.getOriginalFilename();
        //1.3将名称全部小写
        fileName = fileName.toLowerCase();
        //1.2 正则校验  bug!!!!
        if(!fileName.matches("^.+\\.(jpg|png|gif)$")){
            //如果文件不是图片 则返回null
            return null;
        }
        //2.判断是否为恶意程序
        //2.1 通过图片对象 获取宽度和高度
        try {
            BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
            int height = bufferedImage.getHeight();
            int width = bufferedImage.getWidth();
            if(height==0 || width==0){
                return null;
            }            //3实现分目录存储
            //3.1 按照时间将分配目录  /yyyy/MM/dd/
            String dateDirPath = new SimpleDateFormat("/yyyy/MM/dd/")
                    .format(new Date());
            //3.2 "D:/images/yyyy/MM/dd/
            String localDir = localDirPath + dateDirPath;
            File dirFile = new File(localDir);
            if(!dirFile.exists()){//如果目录不存在,则创建目录
                dirFile.mkdirs();
            }

            //4. 防止文件重名  生成UUID.文件类型
            String uuid = UUID.randomUUID().toString()
                            .replace("-","");
            int index = fileName.lastIndexOf(".");
            //获取后缀   .jpg   abc.jpg
            String fileType = fileName.substring(index); //从给定的位置开始 向后截取数据
            String realFileName = uuid + fileType;
            //5.实现文件上传
            // 5.1 拼接文件全路径 目录/文件名称
            String localFilePath = localDir + realFileName;
            // 5.2 完成文件上传
            file.transferTo(new File(localFilePath));

            /**封装返回值.
             * 不带磁盘的本地存储路径 虚拟动态目录
             * D:\images\2021\07\13\8b7b3ef3c88845a6876371b4815244ca.jpg
             */
            String virtualPath = dateDirPath + realFileName;
            //动态拼接网络访问地址
            //图片访问网络地址: http://image.jt.com(域名)/2021/07/13/85a.jpg(动态路径)
            //真实的磁盘地址:    D:/images/2021/07/13/85a.jpg
            String urlPath = preURLPath + virtualPath;
            ImageVO imageVO = new ImageVO(virtualPath,urlPath,realFileName);
            System.out.println(imageVO);
            return imageVO;
        } catch (IOException e) {
            e.printStackTrace();
            //终止程序
            return null;
        }
    }
 }

1.3 图片删除

1.3.1 业务接口文档

在这里插入图片描述

1.3.2 检查VUE.js

在这里插入图片描述

1.3.3 编辑FileController

/**
     * 实现文件删除操作
     *  URL地址: /file/deleteFile
     *  参数:  virtualPath 虚拟路径
     *  返回值: SysResult对象
     */
    @DeleteMapping("/deleteFile")
    public SysResult deleteFile(String virtualPath){

        fileService.deleteFile(virtualPath);
        return SysResult.success();
    }

1.3.4 编辑FileService

//删除文件 1.准备文件全路径  2.执行删除操作
    @Override
    public void deleteFile(String virtualPath) {
        // D:/images/yyyy/MM/dd/uuid.jpg
        String path = localDirPath + virtualPath;
        File file = new File(path);
        //实现文件删除操作
        file.delete();
    }

2. Nginx

2.1 反向代理机制

2.1.1 反向代理介绍

反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率.
特点:

  1. 反向代理服务器 介于用户与目标服务器之间 (3个组成部分)
  2. 用户以为反向代理服务器就是目标服务器.
  3. 用户不清楚真是的目标服务器地址.

2.1.2 反向代理机制

在这里插入图片描述
步骤:
核心知识: 用户出于某种原因 无法直接访问服务器.所以采用代理机制

  1. 用户向代理服务器发送请求,(以为代理服务器就是真实目标服务器)
  2. 代理服务器接收请求时,根据自己的映射文件,重新发起新的请求 访问真实的目标服务器.
  3. 根据映射路径,查找真实的服务器资源.
  4. 获取资源返回给代理服务器.
  5. 代理服务器将资源交换给用户.

2.2 正向代理机制

2.2.1 正向代理

正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
特点:
1.正向代理介于用户与目标服务器之间.
2.用户非常清楚的知道自己访问的远程资源到底是谁.
3.一般采用正向代理时 都是为了实现网络的通信.

2.2.2 正向代理解析

在这里插入图片描述

2.2 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网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

总结: Nginx是一个主流的 反向代理服务器/负载均衡服务器.
特点:
1.占用内存少 启动一个服务运行内存不超过2M 开发语言: C语言
2.并发能力强 官方测试数据 5万/秒并发能力 实测: 2-3万/秒
科普: 单台tomcat服务器并发能力 220/秒 JVM调优 增大JVM运行内存空间
配合服务器监控.根据当前硬件设备进行优化. 经过JVM调优之后的tomcat服务器 可以达到 1000/秒

2.3 Nginx安装

2.3.1 Nginx下载

注意事项: nginx底层开发由C语言完成的. 所以要求不要有中文目录/空格/特殊字符 (程序员操守)
在这里插入图片描述

2.3.2 Nginx解压

nginx启动时会占用80端口.
在这里插入图片描述
单击运行访问: localhost:80 效果如图
在这里插入图片描述

2.4 Nginx关于进程项说明

注意事项: 每次Nginx启动都会启动2个进程,如果重复启动则进程项会有多个.但是其它的进程不起作用 容易混淆.
在这里插入图片描述
关于进程项说明:

  1. 主进程: 主要提供反向代理服务 内存占用大的
  2. 守护进程: 防止主进程意外关闭的. 内存占用小的
    先关闭守护再关闭主进程.

2.5 nginx命令

说明: nginx命令执行需要在nginx.exe的根目录中完成
在这里插入图片描述
启动nginx start nginx 则负责启动nginx服务器,至于报错不提示
重启nginx nginx -s reload 检查程序是否正确,有报错提示.
停止nginx nginx -s stop

2.6 反向代理入门案例

2.6.1 nginx配置文件位置

在这里插入图片描述

2.6.2 编辑nginx配置文件


	#每个反向代理服务都是一个server
    server {
    	#监听端口号 一般默认都是80
        listen       80;
        #拦截用户访问的路径
        server_name  localhost;
		#反向代理配置 / 拦截所有请求
        location / {
        	#root关键字   代表的是一个目录
            root   html;
            #index关键字  默认的欢迎页面
            index  index.html index.htm;
        }
      }

2.7 业务说明

2.7.1 图片代理说明

1.用户URL地址 http://image.jt.com/2021/07/13/2baf5a45be974e8897130a8ea89e1178.jpg
2.文件磁盘地址 D:/images/2021/07/13/2baf5a45be974e8897130a8ea89e1178.jpg
原因: 远程URL地址与本地的磁盘地址不能映射.
解决方案: 用户访问http://image.jt.com 应该到D:/images

2.7.2 修改nginx配置项

说明: 修改之后需要重启nginx服务器.

#配置图片反向代理  1.注意位置   2.注意语法
	server {
		listen 80;
		server_name image.jt.com;
		location / {
			root  D:/images;
		}
	}

2.7.3 HOSTS文件

作用: 主要在本机实现 域名与IP的映射.
文件位置:
在这里插入图片描述
图片回显的工作原理
在这里插入图片描述
说明: hosts文件修改提示权限不足 按照 问题集中的描述 获取权限.
提示: 127.0.0.1 image.jt.com 重启nginx之后 重新上传图片检查是否正常回显

hosts配置/nignx.conf配置参见码云信息:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值