springboot项目图片上传及图片路径分析(jar包形式)

2023-11-02 23:40

本文主要是介绍springboot项目图片上传及图片路径分析(jar包形式),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文仅为记录学习轨迹,如有侵权,联系删除

一、图片路径分析
springboot项目在还没打包时,很多人喜欢把图片上传后,保存在项目的静态资源下,就像下面的图片那样
在这里插入图片描述
这样好像看来没问题,在还没打成jar包时,在idea启动运行正常,图片也确实存储到了静态资源下的images文件夹中,但是一旦打包成jar包后,运行jar包时,发现图片存储路径出错了,图片并不会存储到静态资源下的images文件夹中,而是到服务器的用户下的路径那里去,如果把打包后的jar包在自己电脑运行,按照上面的代码,图片就会存储到C盘下对应的电脑用户那里
在这里插入图片描述
这是因为打包后会生成一个jar包,这个jar可以解压,发现里面的classes就打包有静态资源,而且上面的代码String path = System.getProperty(“user.dir”);在idea启动运行时会获取到项目的根路径,所以在idea启动运行时可以将图片保存在项目下的images文件夹里面,而打包成一个jar后,用java -jar jar包名称启动时,获取的确是C盘下的用户路径,而不会获取到jar所在的目录,跟不会获取到jar里面的classes文件的路径
在这里插入图片描述
这种获取图片路径并存储的方式肯定不是我想要的,我想要的效果是,即使打成jar包后,可以在jar包所在目录下自动生成一个文件夹,上传的图片就保存在这个文件夹中,这样就不论你jar包部署在哪里,都可以获取到jar所在根目录,并自动生成一个文件夹保存上传的图片
在这里插入图片描述
这样的话部署就方便多了

二、实现图片上传
(1)单文件上传(非异步)
我们知道项目打包后的jar包都在target文件夹里面,也就是说target所在文件夹才是jar包所在的路径,所以,图片存储的位置就应该在target里面,这样在打成jar包后,就可以获取jar包所在目录,实现上面分析的功能

前端代码

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"><title>单文件上传</title><link th:href="@{/css/bootstrap.min.css}" rel="stylesheet"><script th:src="@{/js/jquery.min.js}"></script>
</head>
<body>
<div th:if="${uploadStatus}" style="color: red" th:text="${uploadStatus}">上传成功</div>
<form th:action="@{/singleUploadFile}" method="post" enctype="multipart/form-data"><div class="form-group"><label>单文件上传</label><input class="form-control-file" type="file" name="file" required="required" /></div><input id="submit" type="submit" value="上传" />
</form>
</body>
</html>

后端对应控制器的代码

  //来到单文件上传页面(非异步)@GetMapping("/toSingleUpload")public String singleUpload() throws FileNotFoundException {return "singleUpload";}//上传图片(非异步)@PostMapping("/singleUploadFile")public String singleUploadFile(MultipartFile file, Model model){String fileName=file.getOriginalFilename(); //获取文件名以及后缀名//fileName= UUID.randomUUID()+"_"+fileName;//重新生成文件名(根据具体情况生成对应文件名)//获取jar包所在目录ApplicationHome h = new ApplicationHome(getClass());File jarF = h.getSource();//在jar包所在目录下生成一个upload文件夹用来存储上传的图片String dirPath = jarF.getParentFile().toString()+"/upload/";System.out.println(dirPath);File filePath=new File(dirPath);if(!filePath.exists()){filePath.mkdirs();}try{//将文件写入磁盘file.transferTo(new File(dirPath+fileName));//上传成功返回状态信息model.addAttribute("uploadStatus","上传成功");}catch (Exception e){e.printStackTrace();//上传失败,返回失败信息model.addAttribute("uploadStatus","上传失败:"+e.getMessage());}//携带上传状态信息回调到文件上传页面return "singleUpload";}

在idea启动运行,图片保存在target下的upload,打成jar包后运行,则会在jar所在目录下自动生成upload文件存储上传的图片
在这里插入图片描述

实现了图片的上传后,如何获取图片,如果没法获取那上传图片就没意思了,假设我将jar放在路径"E:\文件上传“,图片就在文件夹"E:\文件上传\upload\1.png"里面,如果用这种方式获取图片是不行的,首先是访问不了项目外的资源,其次这个路径应该是动态的,随着jar包的路径变动的,为了实现这两点就需要做个视图解析器
在这里插入图片描述
这样访问”/upload/“就会自动访问到jar包下的upload文件夹,也就可以访问图片了

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>获取图片</title>
</head>
<body><!--这样访问”/upload/“就会自动访问到jar包下的upload文件夹,也就可以访问图片了--><img src="/upload/1.png"></body>
</html>

在这里插入图片描述

这样不论是在idea里运行还是打包运行,都可以完美的获取上传和获取图片

(2)单文件上传(异步)
在(1)非异步单文件上传的基础,再实现异步单文件上传
前端代码

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"><title>无刷文件上传</title><link th:href="@{/css/bootstrap.min.css}" rel="stylesheet"><script th:src="@{/js/jquery.min.js}"></script>
</head>
<body>
<div th:if="${msg}" style="color: red" th:text="${msg}">上传成功</div><form id="form" th:action="@{/ajaxUploadFile}" ><div class="form-group"><label>无刷文件上传</label><input type='file' style='margin: 5px;' name='files' required='required'><input id="submit" type="button" value="上传" onclick="ajaxUpload()" style="margin-top: 10px"/></div></form><script type="text/javascript">function ajaxUpload() {var form=new FormData();//获取选择的文件$.each($('input[name="files"]'),function (index,item) {form.append("files",item.files[0])});//发送异步请求$.ajax({method:'post',url:'/ajaxUploadFile',data:form,processData: false,contentType:false,success:function (res) {//成功返回触发的方法alert(res.msg);},//请求失败触发的方法error:function () {console.log("ajax请求失败");}})}</script>
</body>
</html>

后端代码

//来到单文件上传页面(异步)@GetMapping("/ajaxUpload")public String ajaxUpload(){return "ajaxUpload";}//文件上传管理(异步)@PostMapping("/ajaxUploadFile")@ResponseBodypublic Map ajaxUploadFile(MultipartFile[] files){Map<String,Object> map=new HashMap<>();for(MultipartFile file:files){//获取文件名以及后缀名String fileName=file.getOriginalFilename();//获取jar包所在目录ApplicationHome h = new ApplicationHome(getClass());File jarF = h.getSource();//在jar包所在目录下生成一个upload文件夹用来存储上传的图片String dirPath = jarF.getParentFile().toString()+"/upload/";System.out.println(dirPath);File filePath=new File(dirPath);if(!filePath.exists()){filePath.mkdirs();}try{//将文件写入磁盘file.transferTo(new File(dirPath+fileName));//文件上传成功返回状态信息map.put("msg","上传成功!");}catch (Exception e){e.printStackTrace();//上传失败,返回失败信息map.put("msg","上传失败!");}}//携带上传状态信息回调到文件上传页面return map;}

在这里插入图片描述

在这里插入图片描述

获取图片的方式参考(1)单文件上传(非异步)

三、总结
(1)图片不能存储在项目里面的静态资源里面
(2)图片存储的位置在jar包所在目录,没打jar包时是target下的目录位置,打jar包后是jar所在目录(动态)
(3)图片存储路径的获取用以下代码,获取的路径是target的目录

  //获取jar包所在目录ApplicationHome h = new ApplicationHome(getClass());File jarF = h.getSource();//在jar包所在目录下生成一个upload文件夹用来存储上传的图片String dirPath = jarF.getParentFile().toString()+"/upload/";System.out.println(dirPath);

四、更新配置文件
更新了部署环境的判断,jar包部署可以有Linux环境和window环境,下面增加了环境的判断

@Configuration  //必须加上
public class MyWebMvcConfig extends WebMvcConfigurerAdapter {//将jar文件下的对应静态资源文件路径对应到磁盘的路径(根据个人的情况修改"file:static/"的static的值@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {ApplicationHome h = new ApplicationHome(getClass());File jarF = h.getSource();String dirPath = jarF.getParentFile().toString()+"/upload/";String os = System.getProperty("os.name");System.out.println(os);if (os.toLowerCase().startsWith("win")) {  //如果是Windows系统registry.addResourceHandler("/upload/**").addResourceLocations("file:"+dirPath);System.out.println("file:" + dirPath);} else {  //linux 和mac
//            registry.addResourceHandler("/upload/**") //虚拟路劲
//                    .addResourceLocations("file:" + System.getProperty("user.dir") + "/upload/");//jar 同级目录
//            System.out.println("file:" + System.getProperty("user.dir") + "/upload/");registry.addResourceHandler("/upload/**").addResourceLocations("file:"+dirPath);System.out.println("file:" + dirPath);}}}

转自https://blog.csdn.net/qq_40298902/article/details/106609090

这篇关于springboot项目图片上传及图片路径分析(jar包形式)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/334091

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Java中的.close()举例详解

《Java中的.close()举例详解》.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,:本文主要介绍Java中的.... 目录当你遇到以下三种情况时,一定要记得使用 .close():用法作用举例如何判断代码中的 input