初学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参数即可。