Spring/multipart

Spring 파일 업로드 ⑤ - 이미지 판별 & 썸네일 생성 + 업로드 결과 출력

cinnamonbrown 2026. 3. 26. 12:13

 

이전 글에서는 파일 크기 제한, 확장자 제한, UUID를 적용해 안전하게 파일을 저장하는 방법을 알아보았습니다.

 

2026.03.18 - [Spring/multipart] - Spring 파일 업로드 ④ - 파일 크기, 확장자 제한 & UUID 파일 이름 처리


하지만 업로드가 성공하더라도 사용자는 지금 어떤 파일이 올라갔는지 바로 확인하기 어렵습니다.

 

그래서 이번 글에서는

  • 업로드된 파일이 이미지인지 확인하고
  • 이미지 파일의 경우 썸네일을 생성하며
  • 업로드 결과를 uploadAjax.html 화면에 리스트 형태로 출력하는 과정

을 정리해보겠습니다.


📌 1. 이미지 타입 확인이 필요한 이유

업로드된 파일이 이미지인지 아닌 지에 따라 처리 방식이 달라지기 때문입니다.

 

이미지 타입 일반타입 
썸네일 생성 가능 그대로 표시

 

 

특히 이미지의 경우, 원본을 바로 보여주기보다는 작은 썸네일을 먼저 보여주도록 하는 것이 일반적입니다.

 


📌  2. 이미지 타입 확인 함수 만들기

파일이 이미지인지 확인하기 위해 다음과 같은 함수를 만들어줍니다.

private boolean checkImageType(File file){

    try{
        String contentType= Files.probeContentType(file.toPath());
        log.info(MyUtil.getColor()+"파일타입은 "+ contentType+MyUtil.END);
        if(contentType==null) return false;
        return contentType.startsWith("image");
    }
    catch(Exception e){
        log.error("checkImageType error", e);   // ✅ 스택트레이스 로그
        return false;
    }

}

 

☑️ 2.1 파일 타입 확인하기 (MIME 타입)

 

String contentType= Files.probeContentType(file.toPath());


Files.probeContentType() : 파일의 실제 타입(MIME 타입)을 확인하는 메서드

 

 예를 들어


이미지 파일 → image/png

PPT 파일 → application/vnd.openxmlformats-officedocument.presentationml.presentation

👉 즉, 확장자가 아닌 실제 파일 타입을 기준으로 판단합니다.


☑️ 2.2 이미지 여부 판단하기

return contentType.startsWith("image");


contentTypeimage 로 시작하면  이미지 파일 🅾️  ▶︎  true 반환


📌 3. 썸네일 생성하기

이미지 파일이라면 썸네일을 생성해줍니다.

if(checkImageType(saveFile)){


       // 이미지 파일이면 썸네일을 만들어준다
       
       FileOutputStream thumbnail
       = new FileOutputStream(new File(uploadPath,"s_"+uploadFileName));

	Thumbnailator.createThumbnail(f.getInputStream(),thumbnail,100,100);
                    thumbnail.close();
         }
         
      else{
      log.info(MyUtil.getColor()+"!!!image type이 아님!!"+MyUtil.END);
      	  }
          }

☑️ 3.1 FileOutputStream 이란?

FileOutputStream thumbnail = new FileOutputStream(...)


• 파일을 디스크에 직접 쓰기 위한 스트림

• 즉, 썸네일 이미지를 새로운 파일로 저장하기 위해 사용

👉 쉽게 말하면
👉 “이 파일에 데이터를 써주세요”라고 지정하는 역할


☑️ 3.2 Thumbnailator.createThumbnail()

Thumbnailator.createThumbnail(inputStream, outputStream, 100, 100);


• 이미지 파일을 받아서

• 지정한 크기로 줄인 뒤

• 새로운 파일로 만들어줌

👉 여기서는 100x100 크기의 썸네일 생성 & "s_" prefix로 썸네일 구분


📌 4. 업로드 결과 리스트 만들기

 

이제 업로드된 결과를 화면에 보여주는 단계입니다.


☑️ 4.1 결과를 출력할 영역 만들기

<div class="uploadResult">
    <ul>

    </ul>
</div>


☑️ 4.2 업로드 결과 출력 함수 만들기


let uploadResult=$(".uploadResult ul");

function showUploadFile(uploadResultArr){
    let str="";
    $(uploadResultArr).each(function(i,obj){
        str+="<li>"+obj.fileName+"</li>";
    })
    uploadResult.append(str);

}

👉 서버에서 전달받은 파일 정보를
👉 <li> 형태로 만들어 <ul>에 추가합니다.


 

☑️ 4.3 Ajax 요청과 결과 처리

$.ajax({
    url:"/upload/uploadAjaxPost",
    processData :false,
    contentType:false,
    data:formData,
    type:"POST",
    success:function(result){
        alert("File Upload Completed");
        console.log(result);
        showUploadFile(result);

    }
})

👉 핵심 흐름

  1. 파일 업로드 요청
  2. 서버에서 결과 반환
  3. showUploadFile() 호출
  4. 화면에 리스트 출력

💭 마무리하며..

이번 글에서는
업로드된 파일이 이미지인지 확인하고,
이미지 파일의 경우 썸네일을 생성한 뒤,
업로드 결과를 화면에 출력하는 과정까지 살펴보았습니다.
다만, 현재 상태에서는 결과가 undefined로 보일 수 있습니다.
이 부분은 다음 글에서 다룰 @ResponseBody를 통해 해결해보겠습니다.