2012-01-08 2 views
0

REST 응용 프로그램을 구축 중입니다. 파일을 업로드하고 싶습니다. 예를 들어/WEB-INF/resource/uploads에 저장하고 싶습니다.REST 응용 프로그램에서 HttpRequest없이 파일 업로드를위한 컨텍스트 경로

어떻게이 디렉토리의 경로를 얻을 수 있습니까? 내 컨트롤러는 다음과 같습니다.

@RequestMapping(value = "/admin/house/update", method = RequestMethod.POST) 
public String updateHouse(House house, @RequestParam("file") MultipartFile file, Model model) { 
    try { 
     String fileName = null; 
     InputStream inputStream = null; 
     OutputStream outputStream = null; 
     if (file.getSize() > 0) { 
       inputStream = file.getInputStream(); 

       fileName = "D:/" + file.getOriginalFilename(); 
       outputStream = new FileOutputStream(fileName); 

       int readBytes = 0; 
       byte[] buffer = new byte[10000]; 
       while ((readBytes = inputStream.read(buffer, 0, 10000)) != -1) { 
         outputStream.write(buffer, 0, readBytes); 
       } 
       outputStream.close(); 
       inputStream.close(); 
     } 
    } catch(Exception ex) { 
     ex.printStackTrace(); 
    } 

    model.addAttribute("step", 3); 
    this.houseDao.update(house); 
    return "houseAdmin"; 
} 

두 번째 질문 ... 사용자 파일을 업로드하는 가장 좋은 장소는 무엇입니까?

답변

2

/WEB-INF은 파일 업로드를 저장하려고하는 나쁜 장소입니다. 이것이 디스크상의 실제 디렉토리라는 보장은 없으며, 그렇더라도 응용 프로그램 서버는 디스크에 대한 쓰기 액세스를 금지 할 수 있습니다.

파일 저장 위치는 파일로 저장하려는 위치와 실행중인 운영 체제에 따라 다릅니다. 그냥 webapp 자체의 바깥 쪽을 골라 내 충고입니다. 아마도 전용 디렉토리 또한

를 생성, 다른 위치로 MultipartFile를 전송하는 과정은 당신이되고 그것을 만드는 것보다 훨씬 간단합니다 : 당신은 /WEB-INF/resource/uploads에 파일을 저장해서는 안

@RequestMapping(value = "/admin/house/update", method = RequestMethod.POST) 
public String updateHouse(House house, @RequestParam("file") MultipartFile srcFile, Model model) throws IOException { 
    File destFile = new File("/path/to/the/target/file"); 
    srcFile.transferTo(destFile); // easy! 

    model.addAttribute("step", 3); 
    this.houseDao.update(house); 
    return "houseAdmin"; 
} 
+0

위대한입니다. 훨씬 더 짧고, 훨씬 간단하고, 훨씬 좋습니다 :) 감사합니다. – Fixus

1

. 이 디렉토리는 WAR (패키지 된 경우) 또는 서블릿 컨테이너의 어딘가에서 폭발 할 수 있습니다. 첫 번째 대상은 읽기 전용이며 후자는 사용자 파일에 사용하면 안됩니다.

  1. 일부 전용 폴더 :

    은 일반적으로 업로드 된 파일을 저장할 때 고려 두 곳이 있습니다. 사용자가이 디렉토리에 직접 액세스 할 수 없도록하십시오 (예 : 익명 FTP 폴더). 응용 프로그램이 둘 이상의 컴퓨터에서 실행되면이 폴더에 액세스 할 수 없습니다. 따라서 어떤 형태의 네트워크 동기화 또는 공유 네트워크 드라이브를 고려하십시오.

  2. 데이터베이스. 바이너리 파일은 많은 공간을 차지하기 때문에 논쟁의 여지가 있습니다. 그러나이 방법은 응용 프로그램을 배포 할 때 좀 더 간단합니다.

+0

예 저는 DB를 사용할 수 있지만 원하지 않습니다. 페이지 (대부분) 이미지에 표시 될 사용자 파일을 업로드하지 않습니다. 그래서 나는/var/www/project/user_uploads와 같은 디렉토리를 만들어 거기에서 파일을 던져서 업로드해야합니다. – Fixus

+0

내가 틀렸을 때 정정 해 주지만 브라우저에서 접근 할 수있는'/ var/www /'디렉토리가 아닌가? 이는 모든 사용자가 사용자의 제어없이 모든 파일에 액세스 할 수 있음을 의미합니다. 이것은 좀 더 엄격한 보안 모델을 적용하려는 경우 (원시 Apache 액세스가 빠름) 장점 일 수 있지만 보안 구멍이 될 수도 있습니다. –

+0

사실 그렇지만이 디렉토리에 대한 액세스 만 아파치에서 제한 할 수 있습니다. 누군가 이미지 파일에 접근하면 큰 드라마가 아닙니다. 하지만 익명의 FTP 폴더에 대한 예제가 더 좋다는 것에 동의합니다. – Fixus

관련 문제