SpringBoot图片保存与读取
在自己做一些小项目的时候遇到一个保存图片的问题,很明显,单独去买一个服务器保存图片划不着,而保存到数据库效率太低了。网上查到的保存方法大多数分两种:一种是直接保存到项目路径下面,这样的话,一旦服务重新部署保存的图片直接就G了。另一种是保存到其他路径,这里介绍的就是保存到其他路径的方法。...
参考大佬博客的链接:https://www.cnblogs.com/zimug/p/13474233.html
SpringBoot版本:2.3.7.RELEASE 发布时间:2022年3月
介绍:
在自己做一些小项目的时候遇到一个保存图片的问题,很明显,单独去买一个服务器保存图片划不着,而保存到数据库效率太低了。
网上查到的保存方法大多数分两种:
一种是直接保存到项目路径下面,这样的话,一旦服务重新部署保存的图片直接就G了。
另一种是保存到其他路径,这里介绍的就是保存到其他路径的方法。
分析:
其实保存与读取关心的无非两点,保存路径与读取路径。
实现方式:
一、配置Static-location实现方式
学过SpringBoot web场景的应该都清楚spring.resources.static-location可以配置静态资源访问路径,这里我们就重写这个属性,在原本四个静态路径的基础上添加上一个保存图片的地址就好了。
static-location的配置:
web:
upload-path: G:/images
spring:
resources:
static-locations: file:${web.upload-path},classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
upload-path就是保存图片的位置,在下面添加静态资源位置的时候,需要加上file:,告诉springboot这是文件中的路径。
接下来是Controller
@RestController
@Slf4j
public class FormTestController {
//获取yaml中配置的上传路径属性
@Value(("${web.upload-path}"))
private String uploadPath;
@PostMapping("/upload")
public String upload(@RequestPart("file") MultipartFile file) throws IOException {
String fileName = file.getOriginalFilename(); //获取文件原名
String visibleUri="/"+fileName; //拼接访问图片的地址
String saveUri=uploadPath+"/"+fileName; //拼接保存图片的真实地址
log.info("图片原文件名={} 图片访问地址={} 图片保存真实地址={}",fileName,visibleUri,saveUri);
File saveFile = new File(saveUri);
//判断是否存在文件夹,不存在就创建,但其实可以直接手动确定创建好,这样不用每次保存都检测
if (!saveFile.exists()){
saveFile.mkdirs();
}
try {
file.transferTo(saveFile); //保存文件到真实存储路径下
} catch (IOException e) {
e.printStackTrace();
}
return visibleUri;
}
}
前端的body
<body>
<h1>这是首页</h1>
<form method="post" action="/upload" enctype="multipart/form-data">
上传文件:<input type="file" name="file"><br>
<input type="submit" value="提交">
</form>
<img src="/插画1.jpg">
<img src="/插画2.jpg">
<img src="/插画3.jpg">
<img src="/插画4.jpg">
</body>
因为我们把保存图片的地址配置为了静态资源路径,所以/**就可以直接访问到其中的图片了。
使用效果:见文章下面的第三部分。
二、配置addResourceHandlers实现方式
一个配置导入WebMvcConfigurer接口就可以成为web配置类,这个是springboot的常识。
而其中的addResourceHandlers()是添加资源处理器的方法,其实上面的配置static-location本质上也是被这个方法处理的,这个可以自己查看源码。
而我们在web配置类中重写这个方法也可以添加资源处理器。
这里将配置属性保存到application.properties中,没有其他原因,单纯因为刚才yaml用过了。
application.properties
thk.imagesRealPath=G:/images/ #真实保存地址
thk.imagesServerPath=/images #访问地址
上面两个地址的名字可以自己取
真实保存地址:就是你保存到那个盘下的那个文件夹,一定要注意文件夹的路径
访问地址:就是你访问这张图片时要加的前缀
config类
@Configuration
public class MyWebConfig implements WebMvcConfigurer {
//获取真实路径和访问路径
@Value("${thk.imagesRealPath}")
private String realPath;
@Value("${thk.imagesServerPath}")
private String serverPath;
//添加文件服务器位置
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler(new String[]{serverPath+"/**"}).addResourceLocations("file:/"+realPath);
}
这种方式唯一可以说的优点是,你不用把那四个静态资源文件夹再写一遍……
Html的body部分
<body>
<h1>这是首页</h1>
<form method="post" action="/upload" enctype="multipart/form-data">
上传文件:<input type="file" name="file"><br>
<input type="submit" value="提交">
</form>
<img src="images/插画1.jpg">
<img src="images/插画2.jpg">
<img src="images/插画3.jpg">
<img src="images/插画4.jpg">
</body>
我们配置了访问路径为images,所以就要加上它了。
三、static-location的使用效果:
html
图片保存位置
上传图片
上传成功
前端浏览
如果还有疑问可以留言,也欢迎大佬交流!
更多推荐
所有评论(0)