静态资源的上传与访问
在BlessingChess项目中,想要做一个图片实时上传和读取的需求,第一想到的是直接把文件放在static目录下,然后实时上传和读取。
读取资源(也就是web端访问static资源)其实就很简单,Spring Boot 默认就配置了 /static/** 映射,所以无需任何配置就能访问。
很快啊,工具类起手:
1 | package com.example.BlessingChess.utils; |
这还没有问题,但是当实际测试的时候,发现新上传的文件,无法访问到,会报错NoResourceFoundException
资源的实时访问问题,比如上传图片后,然后再访问,可能需要重启才能继续访问,
jar对resources目录进行保护措施,可能读取不到上传的资源
但是有些极少量的文件需要存储到resources目录下,这就需要先获取到reources下的相应目录,此时应该考虑将来运行jar包时不能出错
因此推荐一下两种方式获取static目录:
通过ResourceUtils工具获取static目录
1
2
3
4
5
6try {
File staticDir = new File (ResourceUtils.getURL("classpath:static").getPath());
} catch (FileNotFoundException e) {
// static 目录不存在!
e.printStackTrace();
}通过 ClassPathResource 获取
1 | // 具体到要访问的文件,然后拿到文件流对象 |
当然,更好的方法是避开static目录存储,考虑做成本地硬盘上的映射目录:
添加配置文件WebMVCConfig,然后在添加资源映射
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36package com.example.BlessingChess.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* HttpConverterConfig 类,用于配置Web应用程序的HTTP转换器和资源处理器。
* 实现WebMvcConfigurer接口以自定义Spring MVC的默认配置。
*
* @author LXY
* @version 1.0
* @since 2024-02-20
*/
public class HttpConverterConfig implements WebMvcConfigurer {
/**
* 上传和读取图片的目录路径。
* 该目录应存在且应用程序应具有写入权限。
*/
public static final String uploadDirectory = "image/";
/**
* 配置资源处理器,用于从指定目录提供静态资源。
*
* @param registry 资源处理器注册表,用于注册资源处理器
*/
public void addResourceHandlers(ResourceHandlerRegistry registry) {
System.out.println("file:" + uploadDirectory);
registry.addResourceHandler("/image/**").addResourceLocations("file:" + uploadDirectory);
}
}这里会把**通配符给映射到后面那个目录后面
比如:
http://localhost:8080/image/icon/0/icon.jpg
会被映射成file:E:/StudentOnline/BlessingChess/image/icon/0/icon.jpg
这时候,你可以实时修改该目录里的内容,也可以实时访问。
还没完,当你用浏览器访问的时候,控制台又报错了:
corg.springframewOPk.web.servlet.nesounce.NOResourceFoundException: No static resource favicon.ico.
这不是代码的问题,而是用浏览器请求资源时,都会同时请求标签页图标,当你在postman请求资源时就不会发生这个问题了,或者直接在static目录下放一个favicon.ico文件也行
关于相对路径:
./**代表的是E:\StudentOnline\BlessingChess\即该项目的根路径,src的同级路径,这个./也可以直接省略
- 本文作者: NICK
- 本文链接: https://nicccce.github.io/TechNotes/Static-Resource-Upload&Access/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!