問題描述:
springboot開發的web項目,在Idea中運行一切正常,但打包爲jar並部署本地後,其他訪問正常,卻無法上傳文件!
原因分析:
jvm運行jar時,並不會對jar包進行解壓。
解決方法:
step1:在啓動類中添加一個路徑映射配置
public class ProjectApplication {
public static void main(String[] args) {
SpringApplication.run(ProjectApplication .class, args);
}
// 添加該調用
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/","file:static/");
}
}
step2:在項目配置文件中添加相關配置(這裏以properties配置爲例)
################ 該配置名稱爲自定義,即resourceX和fileDir可以自定義命名
resourceX.fileDir = C:/Users/Administrator/Desktop/photo_album_jar/static
################
spring.resources.static-locations = classpath:static/,file:${resourceX.fileDir}
step3:將要運行的jar內的static目錄移動到與jar包同級目錄下
step4:使用如下自定義調用,獲取文件存儲路徑
...
import org.springframework.util.ClassUtils;
import java.util.*;
...
private String imagePath;
// 獲取文件存儲路徑的方法(config對象爲配置類對象,擁有如“文件存儲路徑”等字段)
private String getImagePath() {
if (null == imagePath) {
URL url = ClassUtils.getDefaultClassLoader().getResource("static");
if (url != null) {
// 當前爲idea中的開發運行,使用下面的代碼生成存儲路徑
String projectPath = url.getPath();
imagePath = projectPath + File.separator + config.imagePath.replace(".", File.separator) + File.separator;
} else {
// 如果是生產環境運行,請將jar中的“static目錄”複製到jar同級的目錄下
imagePath = "static"+File.separator+config.imagePath.replace(".", File.separator) + File.separator;
}
imagePath = FileDataSaveModule.adjustPathNameSeparator(imagePath);
logger.info("文件存儲路徑初始化:" + imagePath);
}
return imagePath;
}
...