- 이미지의 경로에 대한 처리와 중복 이름에 대한 처리가 완료되었다면, 남은 작업은 일반 파일과 이미지 파일을 구분하는 것이다.
- 이미지 파일의 경우에는 화면에 보여지는 작은 이미지(이하 섬네일)를 생성하는 추가적인 처리다.
- 만일 용량이 큰 파일을 섬네일 처리하지 않는다면 모바일과 같은 환경에서 많은 데이터를 소비해야만 하므로 이미지의 경우는 특별한 경우가 아니라면 섬네일을 제작해야만 한다.
- 섬네일을 제작하는 방법은 여러 가지 방식이 있다.
- JDK1.4부터는 ImageIO를 제공하기 때문에 이를 이용해 원본 이미지의 크기를 줄일 수도 있고, ImgScalr와 같은 별도의 라이브러리를 이용하는 방식도 있다.
- JDK에 포함된 API를 이용하는 방식보다는 별도의 라이브러리를 사용하는 경우가 많은데, 이는 이미지를 축소했을 때의 크기나 해상도를 직접 조절하는 작업을 줄이기 위해서다.
- 예제에서는 Thumbnailator 라이브러리를 이용해 섬네일 이미지를 생성한다(https://github.com/coobird/thumbnailator).
< pom.xml > <!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator --> <dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId> <version>0.4.8</version> </dependency>
- UploadController에서는 다음과 같은 단계를 이용해 섬네일을 생성한다.
- 업로드된 파일이 이미지 종류의 파일인지 확인
- 이미지 파일의 경우에는 섬네일 이미지 생성 및 저장
- 화면에서 약간의 검사를 통해 업로드되는 파일의 확장자를 검사하기는 하지만, Ajax로 사용하는 호출은 반드시 브라우저만을 통해 들어오는 것이 아니므로 확인할 필요가 있다.
- 서버에 업로드된 파일은 조금 시간이 걸리더라도 파일 자체가 이미지인지를 정확히 체크한 뒤에 저장하는 것이 좋다.
- 특정한 파일이 이미지 타입인지를 검사하는 별도의 checkImageType() 메서드를 추가한다.
< UploadController > private boolean checkImageType(File file) { try { String contentType = Files.probeContentType(file.toPath()); return contentType.startsWith("image"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return false; }
- 만일 이미지 타입이라면 섬네일을 생성하도록 코드를 수정한다.
< UploadController > @PostMapping("/uploadAjaxAction") public void uploadAjaxPost(MultipartFile[] uploadFile) { // log.info("update ajax post........."); String uploadFolder = "D:\\upload"; // make folder ------- File uploadPath = new File(uploadFolder, getFolder()); log.info("upload path: " + uploadPath); if(uploadPath.exists() == false) { uploadPath.mkdirs(); } // make yyyy/MM/dd folder for (MultipartFile multipartFile : uploadFile) { log.info("---------------------------------"); log.info("Upload File Name:" +multipartFile.getOriginalFilename()); log.info("Upload File Size:" +multipartFile.getSize()); String uploadFileName = multipartFile.getOriginalFilename(); // IE has file path uploadFileName = uploadFileName.substring(uploadFileName.lastIndexOf("\\") + 1); log.info("only File name : " + uploadFileName); UUID uuid = UUID.randomUUID(); uploadFileName = uuid.toString() + "_" + uploadFileName; // File saveFile = new File(uploadFolder, uploadFileName); try { File saveFile = new File(uploadPath, uploadFileName); multipartFile.transferTo(saveFile); // check image type file if (checkImageType(saveFile)) { FileOutputStream thumbnail = new FileOutputStream(new File(uploadPath, "s_" + uploadFileName)); Thumbnailator.createThumbnail(multipartFile.getInputStream(), thumbnail, 100, 100); thumbnail.close(); } } catch (Exception e) { // log.error(e.getMessage()); e.printStackTrace(); } //end catch } //end for }
- Thumbnailator는 InputStream과 java.io.File 객체를 이용해 파일을 생성할 수 있고, 뒤에 사이즈에 대한 부분을 파라미터로 width와 height를 지정할 수 있다.
- 이제 /uploadAjax를 이용해 이미지 파일을 업로드하면 원본 파일은 그대로 저장되고, 파일 이름이 's_'로 시작하는 섬네일 파일이 생성된느 것을 볼 수 있다.
- 반면에 일반 파일의 경우는 그냥 파일만 업로드 되는 것을 볼 수 있다.
< 이미지 파일의 경우 >
<일반 파일의 경우>
- 업로드된 결과를 보면 이미지 파일의 경우에는 앞에 's_'로 시작하는 것을 확인할 수 있다.