2010-04-18 2 views
11

Java EE 웹 응용 프로그램을 개발했습니다. 이 응용 프로그램을 사용하면 사용자가 브라우저를 사용하여 파일을 업로드 할 수 있습니다. 사용자가 파일을 업로드하면이 응용 프로그램은 먼저 업로드 된 파일을 실행중인 서버에 저장 한 다음 처리합니다. 다음과 같이 현재Java EE 웹 응용 프로그램을 통해 서버 (웹 컨테이너)에 파일을 저장하는 방법은 무엇입니까?

는, I는 서버의 파일을 저장하고있다 :

try { 
    // formFile represents the uploaded file 
    FormFile formFile = programForm.getTheFile(); 
    String path = getServlet().getServletContext().getRealPath("") + "/" 
     + formFile.getFileName(); 
    System.out.println(path); 
    file = new File(path); 
    outputStream = new FileOutputStream(file); 
    outputStream.write(formFile.getFileData()); 
} 

이 경우, formFile 업로드 된 파일을 나타낸다.

이제 문제는 일부 서버에서 잘 실행되고 있지만 일부 서버에 getServlet().getServletContext().getRealPath("")null 그래서 난 점점 오전 최종 경로가 null/filename하고 파일이 서버에 저장하지 않습니다 반환하는 것입니다.

public java.lang.String getRealPath(java.lang.String path)

은 지정된 가상 패스에 대응하는 실제의 패스를 포함한 String를 돌려줍니다 : 나는 ServletContext.getRealPath() 방법에 대한 API를 확인

, 나는 다음과 같은 발견했다. 예를 들어, 경로 "/index.html""http://host/contextPath/index.html"에 대한 요청에 의해 제공 될 서버의 파일 시스템에있는 절대 파일 경로를 반환합니다. 여기서 contextPath는이 ServletContext의 컨텍스트 경로입니다.

서블릿 컨테이너 적절한 경로 분리막을 포함하여 실행되는 컴퓨터 및 운영 체제에 적합한 형태로 리턴 할 것이다 실제 경로. 서블릿 컨테이너가 어떤 이유로 든 가상 경로를 실제 경로로 변환 할 수없는 경우 (예 : .war 아카이브에서 내용을 사용할 수있는 경우)이 메소드는 null을 반환합니다.

그래서, 내가 사양으로 getServlet().getServletContext().getRealPath("")

답변

13

은 정말 당신이 기록 된 데이터를 처리해야 특히, 권장하지 않습니다 : 그것은 거래하지

  • 는 휴대 성을 (해치는을 무엇 경우 이 대상 위치이 옵션 인 경우

, 나는 데이터베이스 또는 u에 파일을 저장하는 것에 대한 설정 외부 매개 변수를 필요로

  • ) 클러스터 환경에서 JCR 저장소 (예 : Jackrabbit).

  • +0

    @Pascal 나중에 처리 할 파일 하나만 저장하려고합니다. 그래서 나는 그 파일을 데이터베이스에 저장하는 것이 좋지 않을 것이라고 생각합니다. 어떻게 생각해? 파일은 .csv 파일입니다. 데이터베이스에 저장해야한다고 생각되면 파일 크기가 100MB 또는 200MB 일 수 있으므로 바이트 형식이나 다른 형식으로 저장해야합니다. 둘째, 나는 처음으로 "잭 래빗 (Jackrabbit)"에 대해 들었고 나는 그것이 무엇인지 모른다. 사이트를 살펴 봤지만 튜토리얼을 찾지 못했습니다. 그래서 어느 것이 더 좋을지 말해 주시겠습니까? 데이터베이스를 사용하거나 "Jackrabbit"을 사용 하시겠습니까? –

    +1

    @Yatendra 필자는 "기록을 위해"파일 시스템에 쓰는 단점이있었습니다. 많은 응용 프로그램의 경우이 옵션이 전혀 아닐 수도 있지만 문제는 아닐 수도 있습니다. 자, 귀하의 질문에 대답 ... 1) 데이터베이스에 쓰기 (LOB에서) 할 수 있습니다; 이상적이지는 않지만 하루에 수천 개의 파일을 작성하지 않으면 괜찮습니다. 2) Jackrabbit은 콘텐츠 저장소에 파일을 쓰고 저장하는 표준 API 인 JCR API (JSR-170)의 구현이므로 대안입니다. 하지만 JCR 저장소를 사용하면 작은 응용 프로그램에 과도한 소리가납니다. * I *는 데이터베이스를 사용합니다. –

    +0

    비슷한 질문이 있지만 작은 파일을 저장해야하므로 별도의 설정과 지원이 필요한 모든 종류의 데이터베이스를 사용하는 데 큰 오버 헤드가 있습니다. 그래서이 답변에 찬성표를 던지고 @ Will Hartung의 대답에 대해 투표를하십시오. 왜냐하면 간단한 문제에 대해 훨씬 간단하게 생각하기 때문입니다. – Vladimir

    20

    에 대한 null을 반환도 해당 서버에 파일을 저장할 수있는 다른 방법이 있나요, 당신은 보장하는 유일한 "진짜"경로는 서블릿을 형성 얻을 수 container는 임시 디렉토리입니다.

    당신은 ServletContext.gerAttribute ("javax.servlet.context.tempdir")을 통해 자료를 얻을 수 있습니다. 그러나 이러한 파일은 웹 컨텍스트에서 볼 수 없으며 (즉, 간단한 URL을 게시하여 해당 파일을 제공 할 수 없음) 파일을 웹 응용 프로그램이나 서버가 다시 시작될 때까지 사용할 수 있다고 보장 할 수는 없습니다.

    당신은 단순히 짧은 시간 동안 작업 파일을 저장하는 장소가 필요한 경우, 다음이 당신을 위해 잘 작동합니다.

    디렉토리가 정말로 필요한 경우 환경 변수, Java 속성 (예 : java -Dyour.file.here =/tmp/files ...), 컨텍스트 매개 변수 세트 web.xml에는 웹 양식을 통해 데이터베이스에 저장된 구성 매개 변수 등). 그런 다음이 디렉토리를 설정하는 것은 배포자의 몫입니다.

    그러나 실제로 나중에 해당 파일을 제공해야하는 경우 웹 응용 프로그램에 외부 디렉토리를 "마운트"하는 컨테이너 관련 메커니즘이 필요합니다 (Glassfish는 "대체 doc 루트"로, 다른 개념은 유사한 개념을 가짐) , 또는 웹 앱 외부에서 파일 저장소를 제공하기 위해 서블릿/필터를 작성해야합니다. 이 FileServlet은 매우 완전하며, 알 수 있듯이 어려운 일은 아니지만 자신 만의 제작을하는 것은 쉽지 않습니다.

    편집 :

    기본 취지는 동일하지만, 오히려 "getRealPath"를 사용하는 것보다, 단순히 "getInitParameter"를 사용합니다. 그래서

    :

    String filePath = getServletContext().getInitParameter("storedFilePath") + "/" + fileName; 
    

    그리고 당신의 방법에있을. 다시

    편집 :

    경로의 내용에 관해서는, 나는 그것을 절대 경로를 줘야 할 것. 그렇지 않으면 앱 서버가 기본 경로를 설정하는 위치를 알아야하고 각 앱 서버는 서로 다른 디렉토리를 사용할 수 있습니다. 예를 들어, Glassfish의 작업 디렉토리가 실행중인 도메인의 config 디렉토리라고 생각합니다. 특히 확실한 선택은 아닙니다.

    그래서 절대 경로를 사용해야합니다. 그렇게하면 파일이 어디로 갈지 알 수 있습니다. 필요한 경우 해당 디렉토리의 OS 수준에서 액세스 권한을 제어 할 수 있습니다. 자바 EE 컨테이너에서 파일 시스템에 쓰기

    +0

    서버와 웹 응용 프로그램을 다시 시작할 수있는 디렉토리에 파일을 저장해야합니다. 답변을 드리 자면 컨텍스트 매개 변수를 설정하여 구성 매개 변수로 만들고 싶습니다. 하지만 어떻게 파일을 저장할 수 있을지 모르겠다. 예제에 대한 예제 또는 참조를 제공 할 수 있습니까? –

    +0

    @Will 이미 알고있는 컨텍스트 매개 변수의 값을 검색하는 방법을 보여 주셨습니다. 내 의견이 분명하지 않을 수 있습니다. 사실, 나는 "storedFilePath"컨텍스트 매개 변수에 어떤 가치를 부여 할 것인지를 의미했습니다. 상대 파일 경로 또는 절대 파일 경로? –

    +0

    상대 경로를 지정하면 절대 경로로 변환 할 수 있습니까? –

    관련 문제