복붙노트

[SPRING] war webapp의 Tomcat 서버 절대 파일 액세스

SPRING

war 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. ==============================

    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. ==============================

    2.그것은 전쟁입니다. 당신은 그 안의 파일을 읽거나 쓰지 않습니다.

    그것은 전쟁입니다. 당신은 그 안의 파일을 읽거나 쓰지 않습니다.

    독서는 사소하다; 파일을 클래스 경로에 놓고 자원으로 읽습니다.

    어쨌든 웹 응용 프로그램 내부에 작성하면 안됩니다. 전쟁이 아니더라도 컨텍스트 내의 내용이 재배포 중에 사라질 수 있기 때문에 클러스터 된 경우 한 서버에만있을 수 있습니다. 라이브 어딘가에 구성 할 수 있습니다.

  3. ==============================

    3.어떤 이유로 든 ajava.io.File이 실제로 필요한 경우가 아니면 classpath에서 파일을로드하고 그 파일의 출처에 대해 걱정하지 마십시오.

    어떤 이유로 든 ajava.io.File이 실제로 필요한 경우가 아니면 classpath에서 파일을로드하고 그 파일의 출처에 대해 걱정하지 마십시오.

    getClass().getClassLoader().getResourceAsStream("test.arff")
    
  4. ==============================

    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를 직접 사용했지만보다 편리하게 사용할 수 있도록 함수를 만들었습니다.

  5. from https://stackoverflow.com/questions/20403810/tomcat-server-absolute-file-access-in-war-webapp by cc-by-sa and MIT license