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("")
@Pascal 나중에 처리 할 파일 하나만 저장하려고합니다. 그래서 나는 그 파일을 데이터베이스에 저장하는 것이 좋지 않을 것이라고 생각합니다. 어떻게 생각해? 파일은 .csv 파일입니다. 데이터베이스에 저장해야한다고 생각되면 파일 크기가 100MB 또는 200MB 일 수 있으므로 바이트 형식이나 다른 형식으로 저장해야합니다. 둘째, 나는 처음으로 "잭 래빗 (Jackrabbit)"에 대해 들었고 나는 그것이 무엇인지 모른다. 사이트를 살펴 봤지만 튜토리얼을 찾지 못했습니다. 그래서 어느 것이 더 좋을지 말해 주시겠습니까? 데이터베이스를 사용하거나 "Jackrabbit"을 사용 하시겠습니까? –
@Yatendra 필자는 "기록을 위해"파일 시스템에 쓰는 단점이있었습니다. 많은 응용 프로그램의 경우이 옵션이 전혀 아닐 수도 있지만 문제는 아닐 수도 있습니다. 자, 귀하의 질문에 대답 ... 1) 데이터베이스에 쓰기 (LOB에서) 할 수 있습니다; 이상적이지는 않지만 하루에 수천 개의 파일을 작성하지 않으면 괜찮습니다. 2) Jackrabbit은 콘텐츠 저장소에 파일을 쓰고 저장하는 표준 API 인 JCR API (JSR-170)의 구현이므로 대안입니다. 하지만 JCR 저장소를 사용하면 작은 응용 프로그램에 과도한 소리가납니다. * I *는 데이터베이스를 사용합니다. –
비슷한 질문이 있지만 작은 파일을 저장해야하므로 별도의 설정과 지원이 필요한 모든 종류의 데이터베이스를 사용하는 데 큰 오버 헤드가 있습니다. 그래서이 답변에 찬성표를 던지고 @ Will Hartung의 대답에 대해 투표를하십시오. 왜냐하면 간단한 문제에 대해 훨씬 간단하게 생각하기 때문입니다. – Vladimir