SpringBoot 打包后(jar包) 实现文件上传
文件上传是一个项目最基础的功能,按道理说应该有不会有多困难,但恶心就恶心在 SpringBoot 最方便的优点上!!!
因为 SpringBoot 是内置 Tomcat 的,所以我们并不需要部署到 Tomcat 的服务器,但当打包后(jar包)就出现了问题。
在 IDE 时,因为是正常的文件目录,所以原来的文件上传功能就可以实现,但是打包后,所有的静态文件都变成了 jar 包!!!
这就很头疼,因为当访问 /static 时,实质上访问的是 jar 包文件内容。
这句需要我们配置一个虚拟路径的配置文件:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.seventeen.common.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.io.File; @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Autowired private AppConfig appConfig; /** * 静态资源处理 **/ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { File file = new File(appConfig.getResPhysicalPath() + "/logistics/"); if (!file.exists()) { file.mkdirs(); } System.out.println("静态资源处理:" + appConfig.getResPhysicalPath() + "/logistics/"); //appConfig.getResPhysicalPath() 这表示项目所在的文件夹,下面会有介绍 registry.addResourceHandler("/logistics/**").addResourceLocations("file:" + appConfig.getResPhysicalPath() + "/logistics/"); registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); } }
配置结束就可以正常的访问上传的文件、实现上传功能!!!
这来再追加一个得到项目部署目录的方法:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
ApplicationHome home = new ApplicationHome(getClass()); File jarFile = home.getSource(); String PATH = jarFile.getParentFile().getPath();
得到的 PATH 变量就是项目部署的目录!!!
注:以上方法无论是 IDE 还是部署的 Jar 包都可以运行!!!