[SPRING] war webapp의 Tomcat 서버 절대 파일 액세스
SPRINGwar webapp의 Tomcat 서버 절대 파일 액세스
나는 그의 .war 파일이 Tomcat 서버에 업로드 된 Spring webapp를 가지고있다. 대부분의 기본 기능은 의도 한대로 페이지 뷰와 양식 제출로 작동합니다.
내 문제는 지금 내 webapp 파일을 읽고 쓸 필요가 및 나는 (파일 I / O java.lang.NullPointerException 반환하는)이 얻을 수있는 방법에 관해서는 단서입니다.
나는 다음과 같은 코드를 사용하여 Titi Wangsa Bin Damhore가 제안한 주어진 파일의 절대 경로를 얻어 서버와 관련된 상대 경로를 알 수있다.
HttpSession session = request.getSession();
ServletContext sc = session.getServletContext();
String file = sc.getRealPath("src/test.arff");
logger.info("File path: " + file);
다음은 출력 경로입니다.
/home/username/tomcat/webapps/appname/src/test.arff
그러나 WinSCP를 통해 파일 디렉토리를 검사했을 때 파일의 실제 경로는 다음과 같습니다.
/home/username/tomcat/webapps/appname/WEB-INF/classes/test.arff
여기에 내 질문이있다 :
추신 :이 스레드에서 빼기로 제안 된대로 데이터베이스를 포함 할 필요가 없을 수도 있으므로 두 파일 (각각 1MB 미만)에 액세스해야합니다.
친구 이메일
다음은 필요한 파일에 액세스 할 때 사용하는 코드입니다.
BufferedWriter writer;
try {
URI uri = new URI("/test.arff");
writer = new BufferedWriter(new FileWriter(
calcModelService.getAbsolutePath() + uri));
writer.write(data.toString());
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
}
해결법
-
==============================
1.파일을 읽으려면 :
파일을 읽으려면 :
ServletContext application = ...; InputStream in = null; try { in = application.getResourceAtStream("/WEB-INF/web.xml"); // example // read your file } finally { if(null != in) try { in.close(); } catch (IOException ioe) { /* log this */ } }
파일을 쓰려면 다음을 수행하십시오.
ServletContext application = ...; File tmpdir = (File)application.getAttribute("javax.servlet.context.tempdir"); if(null == tmpdir) throw new IllegalStateException("Container does not provide a temp dir"); // Or handle otherwise File targetFile = new File(tmpDir, "my-temp-filename.txt"); BufferedWriter out = null; try { out = new BufferedWriter(new FileWriter(targetFile)); // write to output stream } finally { if(null != out) try { out.close(); } catch (IOException ioe) { /* log this */ } }
서블릿 콘테이너가 제공하는 tmpdir을 사용하고 싶지 않다면 / path / to / temporary / files 또는 이와 비슷한 서블릿 컨텍스트의 외부에있는 someplace를 사용해야한다. 재배치시 삭제할 수있는 임시 파일 이외의 다른 것을 위해 컨테이너의 임시 디렉토리를 사용하고 싶지는 않습니다.
-
==============================
2.그것은 전쟁입니다. 당신은 그 안의 파일을 읽거나 쓰지 않습니다.
그것은 전쟁입니다. 당신은 그 안의 파일을 읽거나 쓰지 않습니다.
독서는 사소하다; 파일을 클래스 경로에 놓고 자원으로 읽습니다.
어쨌든 웹 응용 프로그램 내부에 작성하면 안됩니다. 전쟁이 아니더라도 컨텍스트 내의 내용이 재배포 중에 사라질 수 있기 때문에 클러스터 된 경우 한 서버에만있을 수 있습니다. 라이브 어딘가에 구성 할 수 있습니다.
-
==============================
3.어떤 이유로 든 ajava.io.File이 실제로 필요한 경우가 아니면 classpath에서 파일을로드하고 그 파일의 출처에 대해 걱정하지 마십시오.
어떤 이유로 든 ajava.io.File이 실제로 필요한 경우가 아니면 classpath에서 파일을로드하고 그 파일의 출처에 대해 걱정하지 마십시오.
getClass().getClassLoader().getResourceAsStream("test.arff")
-
==============================
4.Spring Resource 구성 요소를 사용하여 하품에 의해 제안 된대로 내 파일 경로를 얻습니다 (참고 test.arff는 war 배포 전에 root / src에 있습니다).
Spring Resource 구성 요소를 사용하여 하품에 의해 제안 된대로 내 파일 경로를 얻습니다 (참고 test.arff는 war 배포 전에 root / src에 있습니다).
Resource resource = new ClassPathResource("/test.arff"); String arffPathRaw = resource.getURI().toString(); // returns file:/path/to/file String arffPath = arffPathRaw.replace("file:/", ""); // pure file path
다음으로, 저는 arff를 내가 원하는 파일에 연결했습니다 :
URI uri = new URI("test.arff"); BufferedWriter writer = new BufferedWriter(new FileWriter( arffPath + uri));
빠른 예제를 위해 arffPath를 직접 사용했지만보다 편리하게 사용할 수 있도록 함수를 만들었습니다.
from https://stackoverflow.com/questions/20403810/tomcat-server-absolute-file-access-in-war-webapp by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 왜 @Transactional 메서드가있는 클래스는 자동 실행되지 않을 수 있습니까? (0) | 2019.03.24 |
---|---|
[SPRING] 스프링 캐시를위한 커스텀 KeyGenerator를 어떻게 설정합니까? (0) | 2019.03.24 |
[SPRING] 스프링 프레임 워크 3.0에서 Hibernate와 Jdbc 사용하기 (0) | 2019.03.23 |
[SPRING] Spring 3 MVC - 고급 데이터 바인딩 - 간단한 객체 목록으로 폼 요청 (0) | 2019.03.23 |
[SPRING] Spring 부트 컨트롤러에서 JAXB 생성 요소 반환 (0) | 2019.03.23 |