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地址/{项目内层目录}/文件保存文件名.扩展名 访问到静态资源了