Scenario: 이미지를 웹페이지에서 업로드 후 업로드된 폴더에서 img 태그를 써서 꺼내올려고했는데 여러가지 문제가있었다.

Solutions: 맨처음에는 배포 프로젝트 폴더에만 넣어놓으면 되는줄 알았는데, 생각보다 복잡하다 reponsegetOutputstream 을써주어야한다.



****

9
5985
#224322 Q&A java jsp

이미지 업로드 후 view 할 때 질문입니다.


이클립스+톰캣으로 작업중에 있습니다.

프로젝트가 완료된 후 서비스를 할 때는 war를 뽑아서 톰캣에 디플로이시켜서 구동할 생각입니다.

현재 게시판에시 이미지를 업로드 할 때 진행중인 프로젝트의 workspace에 파일이 업로드 되도록 하였습니다.

업로드경로는 c:/eclipseWorkspace/ProjectName/WebContent/files/
에 올라가도록 하였습니다.

현재 파일 업로드는 정상적으로 되고 있습니다.

한가지 문제가 발생했는데 이미지가 업로드된 게시물을 선택해서 볼 때
그림이 나오지 않더군요. 그런데 이클립스에서 Project Explorer에서 F5를 해주고 나서 다시 게시물을 보면 업로드된 이미지가 잘 나타납니다.

게시물을 올리거나, 수정하고나, 삭제할 때 항상 지금처럼 이클립스 Project Explorer에서 F5를 해주어야 하는건지....

아니면 뭔가 다른 방법이 있다면 알려주셨으면 합니다.
0
1
  • 답변 9

  •  **** 

    흐음... 개발서버의 톰캣에 war 디플로이해서 해봤는데 여기서는 그런거없이 바로바로 되네요.
    이클립스로 톰캣 구동해서 테스트 하는 개발pc에서는 계속 새로고침 해줘야되는건가요?
    0
  •  ****

     

    프로젝트는 WAS의 배포경로에서 실행되게 됩니다.
    이클립스 + 톰캣으로 개발시
    workspace의 소스가 바로 실행되는 것처럼 느껴지지만
    실제로는 이클립스가 소스 변경이 감지될 때마다 자동으로 톰캣 배포 경로로 소스를 복사(배포)해주고
    배포 경로에서 소스가 실행되는 겁니다.
    workspace의 경로와 톰캣에 배포된 소스의 경로는 다르고요.

    그러니까 현재 상황은
    로컬에서는 실행되는 경로(배포 경로)와 업로드 경로(workspace)가 다르기 때문에
    이미지를 찾지 못하는 것이고요,

    개발서버에 올렸을 때는 업로드 경로를 배포 경로 밑의 files로 지정하셨을테니
    이미지가 제대로 보이는 것이겠죠.
    0
  •  ****
     
    아 그리고 로컬에서 실행시
    업로드 후 이클립스의 소스를 새로고침 하면 그 때부터는 제대로 보이는 이유도
    이클립스가 새로고침 하면서 workspace/files에 저장된 이미지를 배포 경로쪽으로 복사해주기 때문에
    그때부터는 제대로 보이는 겁니다.
    0
  •  ****
     
    NG님//답변 감사합니다 ^^. 그 경로를 찾아봐야겠네요!!!
    0
  •  ****

     

    말씀하신대로 경로 찾아내서 거기에 업로드 되도록 했더니 바로바로 됩니다.
    감사합니다!!!
    0
  •  ****

     

    워크스페이스 경로/.metadata/.plugins/org.eclipse.wst.server.core

    톰캣 플러그인의 배포경로입니다.
    요 경로 밑에서 찾아보세요.

    그리고 로컬에서 테스트할 때는 배포되거나 clean할 때마다
    기존에 업로드된 이미지들은 지워질거에요.
    0
  •  ****

     

    NG님//네 말씀하신대로 수정되서 자동으로 reload??하거나 하니까 없어지네요.
    서버에서 war가 새로 디플로이될때도 없어지는데... 이건 방법이 없는 건가요?
    0
  •  ****

     

    그럴 경우
    파일 업로드/다운로드처럼 아예 별도의 디렉토리에 저장하게 한 뒤
    이미지를 response.getOutputStream()에 담아주는 서블릿을 만들어서 불러다 쓰는 방법이 있습니다.

    img 태그의 src 값도 /files/img.jpg 이런식이 아니라
    /imgLoad.do?imgName=img.jpg 처럼 서블릿을 호출하는 식으로 바꾸고요.

    이 방법이 어려우면 배포하기 전에 이미지 업로드 디렉토리를 백업해뒀다가
    배포 후 덮어씌우는 식으로 해야할 겁니다.
    0
  •  ****

     

    NG님//그렇군요. 흐으... 아는게 없다보니 힘들군요. 더 연구해봐야겠습니다.
    0


response 객체를 써서 이미지를 꺼내오는 방법. 좀더 연구를 해봐야 알 듯하다.

Java 0.70 KB
  1. @WebServlet("/files/*")
  2. public class FileServlet extends HttpServlet {
  3.  
  4.     @Override
  5.     protected void doGet(HttpServletRequest request, HttpServletResponse response)
  6.         throws ServletException, IOException
  7.     {
  8.         String filename = URLDecoder.decode(request.getPathInfo().substring(1)"UTF-8");
  9.         File file = new File("/path/to/files", filename);
  10.         response.setHeader("Content-Type", getServletContext().getMimeType(filename));
  11.         response.setHeader("Content-Length"String.valueOf(file.length()));
  12.         response.setHeader("Content-Disposition""inline; filename=\"" + file.getName() + "\"");
  13.         Files.copy(file.toPath(), response.getOutputStream());
  14.     }
  15.  
  16. }






+ Recent posts