본문 바로가기

Dev.BackEnd/Spring & Spring Boot

파일업로드 이후 파일이미지 조정을 위한 섬네일 만들기

 

 

파일업로드를 한 뒤, 외부파일에 저장된 파일을 불러오긴 했지만, 서로 다른 사진사이즈이다 보니, 부트스크랩에 적용시킨 CSS를 건들 수는 없어서, 사진을 등록할 때 여러 사이즈를 등록하기로 했다.

그래서 이용할 건 thumbnailator 라이브러를 이용하려 한다.

이걸 사용해 파일 한개를 등록했을 때 원본파일, 200x200사이즈(S), 400x400사이즈(M) 총 3개를 등록하게 하려한다.

 

1. pom.xml

 

dependency추가

<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>

 

2. vo추가 

imageName: 섬네일로 복제된 파일이름

flag: 사이즈 S, M

imageList: 저장하려는 파일, S, M 총 3개를 list에 넣어 포문을 돌릴 예정

public class FileInfo {
    private Integer id;
    private Integer refId;
    private String filepath;
    private String originalFilename;
    private String systemFilename;
    private String uploadResourcePath;
    private String division;
    private String bossType;
    private Date createDate;
    private String imageName;
    private String flag;
    private List<Map<String,Object>> imageList;
}

 

3. thumbnailator사용

 

3.1 이미지의 사이즈 확인 후 실행하기

    public void insertFile(FileInfo fileInfo, List<MultipartFile> files)throws Exception {
        List< FileInfo> list = new ArrayList< FileInfo>();
        String currentDate = new SimpleDateFormat("yyyyMMdd").format(Calendar.getInstance().getTime());
        String projectPath = fileRootPath +  currentDate + "/";
        String resourcePathName = uploadResourcePath +  currentDate + "/";
        File folder = new File(projectPath);
        if(!folder.isDirectory()) {
            folder.mkdirs();
        }
        if (null != files && files.size() > 0) {

            for(MultipartFile multipartFile : files) {
                UUID uuid = UUID.randomUUID();
                String filename = uuid + "_" + multipartFile.getOriginalFilename();
                File saveFile = new File(projectPath, filename);
                multipartFile.transferTo(saveFile);

                List<Map<String,Object>> imageList = new ArrayList<>();
                imageList.add(new HashMap<String, Object>() {
                    {
                        put("name", filename);
                        put("flag", "O");
                    }
                });
                imageList.add(new HashMap<String, Object>() {
                    {
                        put("name", createTumbnail(projectPath, filename, 200, 200));
                        put("flag", "S");
                    }
                });
                imageList.add(new HashMap<String, Object>() {
                    {
                        put("name", createTumbnail(projectPath, filename, 400, 400));
                        put("flag", "M");
                    }
                });
                fileInfo.setSystemFilename(filename);
                fileInfo.setOriginalFilename(multipartFile.getOriginalFilename());
                fileInfo.setFilepath(resourcePathName);

                imageList.forEach(obj -> {
                    FileInfo img = new FileInfo();
                    img.setRefId(fileInfo.getRefId());
                    img.setDivision(fileInfo.getDivision());
                    img.setImageName(obj.get("name").toString());
                    img.setFilepath(resourcePathName);
                    img.setFlag(obj.get("flag").toString());
                    img.setOriginalFilename(multipartFile.getOriginalFilename());
                    img.setSystemFilename(filename);
                    fileMapper.insertFile(img);
                });
            }
        }
    }
    

/**
     * Thumbnai 생성
     * @param fileName
     * @param width
     * @param height
     * @throws Exception
     */
    private static String createTumbnail(String path, String fileName, int width, int height ) throws Exception {

        File source = new File(path +fileName);
        BufferedImage originalImage = ImageIO.read(source);

        // 원본 이미지의 너비와 높이
        int ow = originalImage.getWidth();
        int oh = originalImage.getHeight();

        // 비율 조정
        if( ow >= oh ) {
            ow = oh;
        } else {
            oh = ow;
        }

        // 계산된 크기로 원본이미지를 가운데에서 crop
        String[] thumbFile = fileName.split("\\.");
        String thumbFileName = thumbFile[0] + "_" + width +"x"+ height + "." +  thumbFile[1];

        Thumbnails.of(source)
                .sourceRegion(Positions.CENTER, ow, oh).size(width, height)
                .toFiles(new File(path), new Rename() {
                    @Override
                    public String apply(String name, ThumbnailParameter param) {
                        return thumbFileName;
                    }
                });
        return thumbFileName;
    }
  • sourceRegin: 이미지를 잘라준다.
    • prositions.center: 이미지의 가운데를 기점으로 자르겠다는 뜻, 가로폭, 세로폭
  • size: 크기조정
  • toFiles: 경로와 이름(새로운 이름으로 하기 위해 new name을 사용했고, 변하지 않게 하려면 Rename.NO_CHANGE를 쓰면 된다.

 

섬네일 데이터

 

 

화면 결과

 

섬네일 사용전

 

 

 

섬네일 사용 후

 

 

 

참고: https://nm-it-diary.tistory.com/66

 

[JAVA] 이미지 리사이즈, 썸네일 만들기 - Thumbnails.of

이미지 용량이 너무 크거나, 썸네일이 필요한 경우 사용할 수 있는 라이브러리 Thumbnails.of 사용 방법을 알아보려고 합니다. 1. import 라이브러리 import net.coobird.thumbnailator.Thumbnails; import net.coobird.thu

nm-it-diary.tistory.com