ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (국비교육) 57 - CDATA + 파일 업로드(중복방지) + 날짜뽑기(SimpleDateFormat) + view만들기(join) + 이미지 파일 띄우기 + 부트스트랩 아이콘 + 다운로드 + 메일 보내기
    개발/국비교육 2023. 8. 22. 11:15

    ■ CDATA

     

     

    쿼리문 사용시 부등호를 인식해서 오류가 나는 경우가 있다. 

     

     

    그럴경우 CDATA를 사용한다. 

     

    CDATA는 그 안을 모두 String 처리 한다. 

    주석도 웬만해서는 <select> 안에 쓰지 않는다. 

     

    ■ 파일 업로드

     

     

    해당 방법으로도 파일 업로드 가능하다. 

     

    https://commons.apache.org/proper/commons-fileupload/ 

     

    FileUpload – Home

    Commons FileUpload The Commons FileUpload package makes it easy to add robust, high-performance, file upload capability to your servlets and web applications. FileUpload parses HTTP requests which conform to RFC 1867, "Form-based File Upload in HTML". That

    commons.apache.org

     

     

    앞 : 실제 업로드 파일 이름   뒤 :서버에 저장될 이름

    두개를 분리하는 이유는 같은 이름으로 저장할 경우 덮어쓰여서 그 전 파일이 사라진다.

    이를 방지하기 위해 서버에 올릴때는 이름을 변경해서 겹치지 않게 올리기 위해서이다. (중복방지)

     

     

    실제 경로 나오면 해당 경로 + 저장할 파일명 넣으면 파일이 업로드 된다. 

    \\ 로 해야지 \ 가 먹으므로 우리는 편하게 / 로 처리한다.

     

     

    MultipartFile 객체의 변수 upfile 에서 transferTo 파일을 실제 내 서버에 저장하는 기능을 이용한다. 

    newFileName 은 파일의 경로 + 저장할 파일명이다. 

     

     

    try catch 도 잡아준다. 

     

     

    String 타입의 경로를 File 형태로 바꾸지 않아서 오류가 뜬다

    따라서 File 형태로 바꿔주고 해당 경로를 넣어준다. 

     

     

    경로가 webapp 밑이므로 폴더를 해당 폴더 아래에 넣어준다. 

     

     

    업로드 올린 파일이 폴더에 자동 저장된 것을 확인할 수 있다. 

     

     

    , 로 연결해서 쓰면 String 파일 처리 안하고 바로 업로드 가능하다. 

     

    ■ 파일 업로드 중복처리 방지하기 

     

     

    같은 파일을 넣으면 덮어쓰기 처리가 되기 때문에 다음 3가지 방법으로 분리 가능하다.

    여기서 우리는 2번째 방법을 사용할 예정이다.

     

     

    랜덤으로 UUID 만들고 이를 String으로 바꾼 후 파일명과 합쳐준다.

    그러면 UUID + 파일명 + 확장자가 합쳐진 파일이 업로드 된다. 

     

     

     

    날짜로 뽑는 방법도 있다. (SimpleDateFormat)

    YYYYMMddHHmmss 로 하는 것은 파일명에 : - 과 같은 기호로 파일을 저장할 수 없기 때문이다. 

     

    dateTime 의 리턴타입이 string 이기 때문에 .toString은 생략해도 무관하다. 

     

     

    세션에 저장된 mid 를 통해서 파일 이름을 id + 날짜 +  uuid + 파일명.확장자 형태로 나타낼 수 있다. 

     

     

    LocalDateTime 자바 1.8 에 새로 추가된 기능이다.

    date는 좀 오래된 버전이다. 

     

     

    최종버전

     

     

    또 다른 방법으로는 FileCopyUtils 방법이 있다.

    FileCopyUtils 은 스프링 프레임 워크에서 제공해 주는 것이다.

     

    앞에 upfile.getBytes() 파일을 뒤에  newFileName 경로로 저장한다.

    FileCopyUtils를 사용하기 위해서는 오리지널 파일을 byte[]로 만들어야 한다. 

     

     

    맵에 들어갈 이름을 정해서 넣어준다. 

    그러면 이클립스에도 정상적으로 들어간 것을 확인 가능하다. 

     

     

    10개씩 역순으로 출력되도록 설정해준다.

     

     

    삭제 안한 것만 뜨게 설정한다.

    삭제된 4번 게시글은 뜨지 않는다. 

     

     

    클릭하면 noticeDetail 로 가도록 설정한다. 

     

     

    detail 메서드도 만들어주고 noticeDetail.jsp 도 만들어준다.

    여기서 requestparam 으로 받는 nno 값은 우리가 onclick으로 찍어줬던 url nno 값을 가져오는 것이다.

    ? 뒤부터는 변수를 나타내고, nno = 해당하는 값을 가져오기 때문이다.

     

     

    삭제안한 게시글의 게시글의 모든 detail 값을 가져온다. 

    그러나 그럴 경우 해당 게시글의 글쓴이 값을 가져오기 힘들다.

     

     

    따라서 새로운 view를 만들고 join 값을 통해 m_name 을 가져온다. 

    n.* 은 n의 모든 값을 가져온다는 뜻이다. 

     

     

    그러면 다음과 같이 이름도 표시할 수 있다. 

     

     

    파일이 있을 경우 해당 파일을 뜨도록 설정한다.

     

    .. 상위 폴더로 가기 위해서 작성했다. 

    nrealfile 은 실제로 저장되는 파일 이름이다.

     

    이미지 파일 있을경우 띄우기 + 없을 경우 다운로드 버튼 나오게 설정

     

     

    길이 뒤에서 3번째부터 마지막 길이까지 fn:substring 을 통해 출력한다.

    위에 두 문장은 같은 말이다.

     

     

    그러면 다음과 같이 확장자명이 나온다.

     

     

     

    .png 파일 포함하기 때문에 true 출력된다.

     

     

    forTokens 를 사용한다. 

    delims 는 .을 기준으로 자른다.

    varStatus 는 순서대로 뽑아주는 것이다.

    우리는 마지막 뽑아주니까 status.last 를 사용한다.

     

     

    choose 구문을 통해 이미지 확장자가 있는 경우에는 우리가 업로드한 파일을 띄워주고,

    그렇지 않고 이외의 확장자라면 다운로드 버튼이 뜨게 한다. 

     

     

    이미지 파일 출력

     

     

    다운로드 버튼 출력

     

    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.8.0/font/bootstrap-icons.css">

    상단에 부트스트랩 아이콘 부르기 위한 link 넣어준다.

     

     

    타이틀 앞에 이미지 넣어준다. 

     

     

    파일이 있을 경우 해당 아이콘 출력된다.

     

     

    이미지일 경우 이미지 파일, 텍스트일 경우 텍스트 파일이 나오도록 출력이 가능하다.

     

    https://icons.getbootstrap.com/

     

    Bootstrap Icons

    Official open source SVG icon library for Bootstrap

    icons.getbootstrap.com

     

    ■ 다운로드 

     

     

    다운로드 뒤에 파일명 경로로 들어가진다. 

     

     

    다운로드 누르면 해당 파일 이름 가져온다.

     

     

    유틸에 만들어준다. 

     

    	//경로 얻어오기
    	public HttpServletRequest getCurrentRequest() {
    	      return ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
    	   }
    	public HttpServletResponse getCurrentResponse() {
    	      return ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getResponse();
    	   }
    	
    	//세션 얻어오기
    	   public HttpSession getSession() {
    		   return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getSession();
    		   }
    	   
    	//업로드 폴더까지의 경로 얻어오기
    	   public String uploadPath() {
    		      return getCurrentRequest().getServletContext().getRealPath("/upload");
    		   }

     

     

    업로드 폴더 경로 알려준다.

     

     

    application/octet-stream : 전송 용도로 쓰겠습니다.

    stream 은 끊임없이 파일을 내보내겠습니다.

     

     

    다음과 같이 response 적어준다. 

    byte[] fileByte 은 바이트 배열로 빼주는 것이다.

     

     

    파일 다운로드가 가능하다. 

     

     

    그러면 아까와 다르게 원래 파일명이 나오게 된다. 

    그러나 경로가 나와 너무 길다.

     

     

    다음과 같이 경로 없이 파일명만 나오게 된다. 

     

    ■ 메일 보내기 (아웃룩)

     

     

    아웃룩 회원가입하고 gradle 에 해당 내용 추가한다.

     

     

    메일 getmapping 처리한다. 

    jsp 도 만들어준다. 

     

     

    메일 보낼 수 있는 창을 다음과 같이 만들어준다. 

Designed by Tistory.