Chapter 22-2

ChangWoo·2023년 11월 10일
0
post-thumbnail

Part 22. 파일 업로드 상세 처리

22.2 섬네일 이미지 생성

  • 이미지의 경로에 대한 처리와 중복 이름에 대한 처리가 완료되었다면, 남은 작업은 일반 파일과 이미지 파일을 구분하는 것이다.
  • 이미지 파일의 경우에는 화면에 보여지는 작은 이미지(이하 섬네일)를 생성하는 추가적인 처리다.
  • 만일 용량이 큰 파일을 섬네일 처리하지 않는다면 모바일과 같은 환경에서 많은 데이터를 소비해야만 하므로 이미지의 경우는 특별한 경우가 아니라면 섬네일을 제작해야만 한다.
  • 섬네일을 제작하는 방법은 여러 가지 방식이 있다.
  • 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에서는 다음과 같은 단계를 이용해 섬네일을 생성한다.
    • 업로드된 파일이 이미지 종류의 파일인지 확인
    • 이미지 파일의 경우에는 섬네일 이미지 생성 및 저장

22.2.1 이미지 파일의 판단

  • 화면에서 약간의 검사를 통해 업로드되는 파일의 확장자를 검사하기는 하지만, 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_'로 시작하는 것을 확인할 수 있다.
profile
한 걸음 한 걸음 나아가는 개발자

0개의 댓글