Spring boot上传文件至项目根目录的解决方案

Spring boot上传文件至项目根目录的解决方案

需求是,上传一张图片到服务器中,不需要进行额外的配置,返回图片在项目中的相对路径,可以直接通过这个项目路径访问到图片文件。

使用本文章的上传方法上传后:

  • 在开发/测试的过程中,图片会保存在 项目路径/target/classes/static文件夹下
  • 打包部署后,图片会保存在 jar包同级目录/static

上传文件的步骤:

  1. 获取请求参数中的文件
  2. 获取文件保存路径
  3. 创建文件夹
  4. 获取文件保存名
  5. 创建输出流FileOutputStream
  6. 写入输出流
  7. 关闭输出流

获取请求参数中的文件

在spring框架中提供了一个名为 org.springframework.web.multipart.MultipartFile 的接口用来接受请求中包含的文件。

每个MultipartFile对象可以接受一个请求中的文件。

但是我们不能够直接将MultipartFile对象转为java.io中的File对象,如果需要转换,则需要调用MultipartFile对象的getInputStream()方法,通过输入流转换成文件。

/*
 *  @param  file: 接受请求中的文件
 *  @param  files:  保存请求中的多个文件
 */

@PostMapping("/file")
public String uploadFile(MultipartFile file , MultipartFile files[]){
	
    //文件操作
    saveFile(file);
    
    for(int i = 0 ;i<files.length;i++){
        //文件操作
        saveFile(files[i]);
    }
    
}

获取文件保存路径

首先需要明确,springboot项目在开发过程中的项目路径和打成jar部署后的路径不太一样。

想要网页通过文件路径直接访问服务器中的资源文件,需要将文件保存在项目的静态资源文件夹中。

所以需要在项目配置文件中,配置项目静态资源文件夹:

spring.resources.static-locations=classpath:static/

这样输入访问文件路径后,服务器会自动在静态资源文件夹中查找是否保存有相对应的静态资源。


接着,需要在java代码中获取到文件路径,通过Spring自带的ResourcesUtils工具,调用

String path = new File(ResourceUtils.getURL("classpath:").getPath()).getAbsolutePath()

得到项目目录绝对路径

子文件夹名可自行根据需要添加

path = path + "{项目内层目录}";

这样就可以得到文件保存的基本路径了。

得到基本路径后,为防止路径中文件夹不存在,对路径指向的文件夹判断是否存在,若不存在则创建文件夹。

File dirPath = new File(path);
if (!dirPath.exists()){
     dirPath.mkdirs();
}

获取文件名

为了保证客户端访问文件时文件格式一致,需要获取到上传文件的名字包括拓展名。

而这可以通过MultipartFile对象的getOriginalName方法可以获取到。

获取到文件名字符串后,再使用字符串分割方法,将拓展名部分分割开得到拓展名。

对于新文件的命名可以按照自己的想法命名,最后只需要加上与源文件相同的拓展名即可。

保存文件

得到了文件保存的路径和文件名后,就可以开始写入文件了。

OutputStream out = new FileOutputStream(absPath);//absPath为文件保存文件夹路径+文件名
out.write(file.getBytes());//file为MulitpartFile对象
out.flush();
out.close();//关闭输出流

写入文件后要记得关闭数据流

最后浏览器就可以通过ip地址/{项目内层目录}/文件保存文件名.扩展名 访问到静态资源了

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
spring-boot-maven-plugin 是一个 Maven 插件,它可以将 Spring Boot 应用程序打包成可执行的 JAR 文件,同时也可以将应用程序的依赖项打包成内置的 JAR 文件。这个插件还有一个很棒的功能,就是它可以将应用程序的配置文件打包到 JAR 包之外,这样在应用程序升级时,可以直接替换现有的 JAR 文件而不需要担心会覆盖配置文件。 在默认的情况下,Spring Boot 将 application.properties 或者 application.yml 文件打包到 JAR 包的根目录下,这种默认的方式并不是最好的,因为在应用程序升级时,配置文件会被一起打包进去,这样会产生一些困扰,比如你需要手动备份这些配置文件。 为了解决这个问题,spring-boot-maven-plugin 插件提供了一个很好的解决方案,就是将配置文件打包到 JAR 包之外,具体的做法是在 pom.xml 文件中添加如下配置: ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <classifier>exec</classifier> </configuration> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> <configuration> <classifier>exec</classifier> <compress>false</compress> <shutdown>graceful</shutdown> <finalName>${project.artifactId}-${project.version}-exec</finalName> </configuration> </execution> </executions> </plugin> </plugins> </build> ``` 这个配置中添加了一个 classifier 属性,它会创建一个带有 exec 后缀的 JAR 包,该 JAR 包除了包含应用程序的类文件和依赖项,还会包含配置文件和其他静态资源文件。在 pom.xml 文件中加入以上配置,并在应用程序的根目录下创建一个名为 config 的目录,将配置文件放置在该目录中,然后重新编译和打包应用程序,你将会得到一个新的 JAR 文件,该文件会在根目录下生成一个名为 config 的文件夹,其中包含你的配置文件。这样就实现了将配置文件打包到 JAR 包之外的目的。 总结一下,spring-boot-maven-plugin 插件提供了一个将应用程序的配置文件打包到 JAR 包之外的方式,只需要在 pom.xml 文件中配置一个 classifier 属性即可实现。这样可以避免在应用程序升级时面临配置文件被覆盖的问题,也便于组织和管理配置文件。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值