2014-09-04 4 views
0

내 응용 프로그램 사용자가 업로드 한 특정 이미지가 있으며 해당 이미지에만 액세스해야합니다. 미리보기 이미지 또는 다른 방법으로 어떻게 표시 할 수 있습니까? 파일 시스템 (webapp 외부)에 이미지를 저장하고 db에 경로 만 저장합니다.스프링 응용 프로그램에서 jsp로 이미지를 표시하는 방법

하나의 옵션은 tomcat을 구성하여 server.xml의 다음 변경 사항을 통해 해당 디렉토리를 노출하는 것입니다.

localhost:8080/context/images/b1sd2e09102.jpg 

등을 통해

<Context path="/images" docBase="/home/app/basedir" />  

그리고 액세스 이미지

그러나이가 좋지 않은 (나는 그들이 추측 할 수 없도록 무작위 이미지 이름을 생성하는 UUID를 사용하고 있습니다) 나를위한 해결책 (다른 사용자가 어떻게 든 알 수있는 경우)은 여전히 ​​공개됩니다. 현재 내 스프링 컨트롤러에서 다음을 통해이를 다운로드 할 수 있어요 :

@RequestMapping(value = "/download", method = RequestMethod.GET) 
public void download(Model model, @RequestParam("id") String key, HttpServletResponse response) throws Exception { 
    //get item from db first based on key 
    Item item = dbservice.get(key); 
    InputStream is = new FileInputStream(item.getPath());  
    response.setHeader("Content-Disposition", "attachment; filename=" + item.getFileName()); 
    IOUtils.copy(is, response.getOutputStream()); 
    response.flushBuffer(); 
    .... 
} 

브라우저에 이러한 이미지를 렌더링하는 방법이 있나요?

답변

1

당신은 완전한 해결책에서 멀지 않았다. 나는 현재 당신의 모범에서 가까운 것을 사용하고 있습니다. 간단히 Content-Length 헤더를 추가하고 파일 업로드시 데이터베이스에 저장하는 Image/xxx 콘텐츠 유형을 사용하기 만하면됩니다. 존재하지 않으면 원래 이름의 확장자를 사용합니다. 당신은 단지 브라우저가 이미지

<img src="/appContext/dowload?id=key"/> 

를 삽입 할 이미지 태그를 넣어야 만, 이제

@RequestMapping(value = "/download", method = RequestMethod.GET) 
public void download(Model model, @RequestParam("id") String key, HttpServletResponse response) throws Exception { 
    //get item from db first based on key 
    Item item = dbservice.get(key); 
    InputStream is = new FileInputStream(item.getPath()); 
    String type = item.getFileType(); 
    if ((type == null) || (type.isEmpty())) { 
     String name = item.getFileName(); 
     if (name.length > 2) { 
      int i = name.substring(0, name.length() - 1).lastIndexOf("."); 
      if (i > 0) { 
       type = "Image/" + name.substr(i + 1); 
      } 
     } 
    } 
    if ((type == null) || (type.isEmpty())) { 
     tyoe = "application/octet-stream"; 
    } 
    response.setHeader("Content-Type", type); 
    int l = item.getFileLength(); 
    if (l > 0) { 
     response.setContentLength((int) resource.contentLength()); 
    } 
    response.setStatus(HttpServletResponse.SC_OK); 
    IOUtils.copy(is, response.getOutputStream()); 
    response.flushBuffer(); 
    .... 
} 

하지만 당신은 크기를 넣어합니다 alse해야

은 그래서 같이 수 결국 이미지 태그의 유형이됩니다.

관련 문제