SpringBoot 中獲取專案的路徑和檔案流

liftsail發表於2024-06-01

SSM web專案

以工程名為TEST為例: 
(1)得到包含工程名的當前頁面全路徑:request.getRequestURI() 
結果:/TEST/test.jsp 
(2)得到工程名:request.getContextPath() 
結果:/TEST 
(3)得到當前頁面所在目錄下全名稱:request.getServletPath() 
結果:如果頁面在jsp目錄下 /TEST/jsp/test.jsp 
(4)得到頁面所在伺服器的全路徑:application.getRealPath("test.jsp") 
結果:D:\resin\webapps\TEST\test.jsp 
(5)得到頁面所在伺服器的絕對路徑:absPath=new java.io.File(application.getRealPath(request.getRequestURI())).getParent(); 
結果:D:\resin\webapps\TEST 


2.在類中取得路徑: 

(1)類的絕對路徑:Class.class.getClass().getResource("/").getPath() 
結果:/D:/TEST/WebRoot/WEB-INF/classes/pack/ 
(2)得到工程的路徑:System.getProperty("user.dir") 
結果:D:\TEST 

3.在Servlet中取得路徑: 

(1)得到工程目錄:request.getSession().getServletContext().getRealPath("") 引數可具體到包名。 
結果:E:\Tomcat\webapps\TEST 
(2)得到IE位址列地址:request.getRequestURL() 
結果:http://localhost:8080/TEST/test 
(3)得到相對地址:request.getRequestURI() 
結果:/TEST/test
註釋:當專案中的jsp頁面有<base href="<%=request.getContextPath()%>/">標籤時,可以使用以下程式碼來獲取根目錄,以防專案名為空的時候報錯:
 function getRootPath(){ 
return $("base").attr("href"); 
}  
var webpath=getRootPath(); //webpath就是目錄路徑變數 
 

SpringBoot Web專案

import org.springframework.util.ClassUtils;
import org.springframework.util.ResourceUtils;

1、在使用者頭像上傳的功能實現時,獲取目錄路徑
String path = ClassUtils.getDefaultClassLoader().getResource("").getPath()
//輸出path: D:/java_project/manage/target/classes/

專案中圖片上傳的路徑是  resources/static/img/headImg/  中,路徑可以這樣寫:
String path = ClassUtils.getDefaultClassLoader().getResource("").getPath()+"static/img/headImg/";
//輸出path:/D:/java_project/manage/target/classes/static/img/headImg/

2、還有一種寫法,效果一樣 
//獲取專案的根目錄
File path = new File(ResourceUtils.getURL("classpath:").getPath());
System.out.println("path:"+path.getAbsolutePath());
//path:D:\java_project\manage\target\classes
        
//獲取專案根目錄下的某個資料夾,這裡是  "static/img/headImg/"
File uploadpath = new File(path.getAbsolutePath(),"static/img/headImg/");
System.out.println("uploadpath:"+uploadpath.getAbsolutePath());
//uploadpath:D:\java_project\manage\target\classes\static\img\headImg

//也可以直接寫成這樣
String path = ResourceUtils.getURL("classpath:static/img/headImg/").getPath();
注意:ResourceUtils的這種寫法在linux系統是無效,請注意

推薦使用一下兩種方式:

String rootPath = Class.class.getClass().getResource("/").getPath();
//D:\java_project\manage\target\classes\

String rootPath2 = ClassUtils.getDefaultClassLoader().getResource("").getPath();
//D:\java_project\manage\target\classes\

如果獲取jdk下的目錄,需要指定目錄資料夾獲取。 ClassUtils是Spring util包下的類

public static void main(String[] args) {
    // 獲取模板檔案
    String rootPath = Class.class.getClass().getResource("/").getPath();
    String rootPath1 = Class.class.getClass().getResource("/jasper").getPath();
    String ctxPath = ClassUtils.getDefaultClassLoader().getResource("").getPath();
    String ctxPath1 = ClassUtils.getDefaultClassLoader().getResource("jasper").getPath();
    log.info("\n rootPath:  {}, \n rootPath1:{}", rootPath, rootPath1);
    log.info("\n ctxPath: {},\n ctxPath1:{}", ctxPath, ctxPath1);
}

SpringBoot 中獲取專案的路徑和檔案流

獲取resources下的檔案流

1、透過ClassPathResource類獲取檔案流,SpringBoot中所有檔案都在jar包中,沒有一個實際的路徑,因此可以使用以下方式。ClassPathResource、PropertiesLoaderUtils都是Spring core包下的類

	 ClassPathResource classPathResource = new ClassPathResource("jdbc.properties");
	 Properties properties = PropertiesLoaderUtils.loadProperties(classPathResource);
	 properties.list(System.out);
	 System.out.println("==============================================");
	 String property = properties.getProperty("jdbc.username");
	 System.out.println("property = " + property);

2、直接使用getResourceAsStream方法獲取流,上面的幾種方式都需要獲取檔案路徑,但是在SpringBoot中所有檔案都在jar包中,沒有一個實際的路徑,因此可以使用以下方式。

	InputStream resourceAsStream = RuoYiAuthApplication.class.getClassLoader().getResourceAsStream("jdbc.properties");
	Properties properties = new Properties();
	properties.load(resourceAsStream);
	properties.list(System.out);
	System.out.println("==============================================");
	String property = properties.getProperty("jdbc.url");
	System.out.println("property = " + property);

SpringBoot 中獲取專案的路徑和檔案流

相關文章