初学SpringBoot二【访问静态资源&文件上传】


前言

嗨,我们又见面了。最近项目收尾,时间紧张。拖更了!抱歉哈。言归正传,今天我们来介绍SpringBoot访问静态资源以及文件上传。如有表达不清楚,还望各位严厉指出!!!


一、SpirngBoot访问静态资源

1.访问直接放在static包下的资源

SpringBoot访问静态资源的方式非常之简单,直接上效果图。

  • 第一步:在resources包下建一个static包,在这个包下新建一个HTML页面。
    如下图:

在这里插入图片描述注意: SpringBoot的静态资源默认是在resources包下的static包 在resources包下新建一个static文件夹将要访问的静态资源放在这个目录下

  • 第二步:启动项目在浏览器中输入地址:http://127.0.0.1:8080/demo.html
    效果如下:
    在这里插入图片描述怎么样,简单吧。直接用项目的相对路径就直接访问到了哦!
    这里我再演示一个不再static包下,我访问notFountDistory这个与static包同一级目录的文件看看会怎么样。
    效果如下:
    在这里插入图片描述
    在浏览器中输入:http://127.0.0.1:8080/notFount.jpg
    效果如下:
    在这里插入图片描述SpringBoot无法找到这个文件,再试试加上包名称呢?
    在这里插入图片描述
    可以看到还是不行!!!

2.访问直接放在static包多级目录下的资源以及访问方式

通过上面的测试我们得知,SpringBoot默认只能访问到static包下的静态资源。但是我就是不服,我突然又有一个想法,如果我把资源放在static的多级目录下面会怎么样呢?或者它的访问方式会不会发生什么变化呢?

如图:我在static目录下创建了a/b/c三层目录,并且对应的三个页面:a.html、b.html、c.html。
那这时候我们能够想到的是在相对路径前面加上/a/就可以了,那我们就试一下咯!
输入地址:http://127.0.0.1:8080/a/a.html
如图:
在这里插入图片描述推测的不错,可以访问。那如果直接相对文件名能够访问吗?输入地址:http://127.0.0.1:8080/a.html
在这里插入图片描述可是我还是不服,难道以后的index.html只能放在static目录下吗。大家都知道这根本就不可能的。
所以我在网上查找了一些资料,然后知道是WebMvcAutoConfiguration.java类控制的。关于这个类的解析,我后面会专门针对它做一个详细的讲解,我就直截了当的说一下SpringBoot默认的可以直接访问的静态资源目录。

SpringBoot静态资源路径配置

  • SpringBoot默认静态资源目录
classpath:/META-INF/resources/ 
classpath:/resources/
classpath:/static/ 
classpath:/public/
/:当前项目的根路径
  • 配置自定义静态资源路径
    在resources目录下创建一个application.yml文件
    配置信息如下:
# 配置这个是可以让浏览器直接访问到的静态资源存放地址
spring.resources.static-locations: classpath:/static/, classpath:/static/index/, classpath:/notFountDistory/

有了application.yml文件后。就可以访问到之前不在static目录下的静态资源了。
如下:
在这里插入图片描述可以看到之前notFountDistory包下的图片访问不到,但是配置了notFountDistory包后,这个包下的资源也可被浏览器直接访问到了。其他目录的配置方式都一样

二、SpringBoot文件上传

1.1.1回顾Spring+SpringMVC实现文件上传

老规矩,鲁迅先生曾经说过:不经常复习老技术的程序员不是好程序员。那么在学习SpringBoot文件上传之前先回一下Spring+SpringMVC是怎么实现文件上传的。
该章节我单独拿出来了。
文章链接:Spring+SpringMVC文件上传及源码解析&文件上传原理总结

1.1.2SpringBoot单个文件上传

SpringBoot的文件上传非常之简单,两步就可以搞定哦!

  • 第一步:编写Controller
package com.test.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

@Controller
@RequestMapping("/springBoot/controller/upload")
public class FileController {


    /**
     * 单个文件上传时的接收参数的方式如下
     * @param file
     * @RequestParam("file") 这里要注意@RequestParam注解中的值,
     * 必须要与input中的name值一致,否则将无法接收到文件
     * <input type="file" name="file"/>
     */
    @RequestMapping("/upload")
    public void upload (@RequestParam("file") MultipartFile file) throws IOException {
        if(file != null){
            String name = file.getName();
            System.out.println("MultipartFile类中的getName的返回值:"+name);
            String filename = file.getOriginalFilename();
            String path = "D:\\abc\\springboot\\upload\\";
            File newFile = new File(path+filename);
            /**
             * MultipartFile对象已经替我们封装了文件上传的具体实现代码
             * 参数就是你要上传后生成的新文件的全路径
             * 比如:
             *      你上传的源文件路径是C://test.jpg
             *      你想要将该文件上传到D://images//
             *      那么此时transferTo(args)中的参数就应该是"D://images//copyTest.jpg"
             * 这时候MultipartFile类的transferTo方法就会帮你在你指定的全路径下生成该文件
             */
            file.transferTo(newFile);
            System.out.println("文件上传完毕!!!");
        }
    }
}

  • 第二步:编写上传页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>springBoot文件上传</title>
</head>
<body>
  <form method="post" action="/springBoot/controller/upload/upload" enctype="multipart/form-data">
    TXT:<input type="file" name="file"/>
    <!-- DOCX:<input type="file" name="file"/>
    图片:<input type="file" name="file"/> -->
    <input type="submit">
  </form>

</body>
</html>

1.1.3SpringBoot文件批量上传

SpringBoot的批量上传其实与单个文件上传类似,只有几个地方需要大家注意。我就直接贴代码了

    /**
     * SpringBoot批量上传文件接口
     * 这里特别说明一下,在批量上传时要注意2个地方;
     * 1、@RequestParam中的value值必须是input标签中的name值;
     * 什么意思呢,例如我们的上传页面如下
     *     <form method="post" action="/springBoot/controller/upload/uploadArray" enctype="multipart/form-data">
     *         TXT:<input type="file" name="files"/>
     *         DOCX:<input type="file" name="files"/>
     *         图片:<input type="file" name="files"/>
     *         <input type="submit">
     *     </form>
     *      其中的name值必须和@RequestParam中的value值一致
     * 2、参数类型必须是 MultipartFile[]数组
     * @param files
     * @return
     */
    @RequestMapping("/uploadArray")
    @ResponseBody
    public String upload(@RequestParam(value = "files",required = false) MultipartFile[] files){
        String msg = "文件批量上传成功!!!";
        if(files != null){
            for(int i =0;i<files.length;i++){
                MultipartFile file = files[i];
                String filename = file.getOriginalFilename();
                File newFile = new File("D:\\abc\\springboot\\upload\\"+filename);
                try {
                    file.transferTo(newFile);
                } catch (IOException e) {
                    e.printStackTrace();
                    msg = "文件上传失败,原因:"+e.getMessage();
                }
            }
            return msg;
        }
        return msg;
    }
  • 页面如下
<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>SpringBoot文件批量上传</title>
</head>
<body>
   <form method="post" action="/springBoot/controller/upload/uploadArray" enctype="multipart/form-data">
       TXT:<input type="file" name="files"/>
       DOCX:<input type="file" name="files"/>
       图片:<input type="file" name="files"/>
       <input type="submit">
   </form>
</body>
</html>

注意:在批量上传时,页面每个input元素的name属性值必须是接口中@RequestParam注解value的值,否则接口不会将文件数据解析到MultipartFile中去,并且MultipartFile的类型必须是数组


总结

SpringMVC上传文件时必须手动配置commonsMutipartResoulver上传文件解析器,而SpringBoot则已经帮我们做好一切,只需要在接口使用MultipartFile参数即可。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值