JAVA에서 ZIP 파일 압축해제 방법 ❗

박성현·2025년 8월 14일

개발중 학습

목록 보기
15/44

Java에서 ZIP 파일 안의 특정 확장자 이미지 추출하기

웹 서비스에서 다수의 이미지를 업로드할 때, 사용자가 ZIP 파일로 묶어서 전송하는 경우가 많습니다.
이 글에서는 Spring 환경에서 업로드된 ZIP 파일을 해제하고, 특정 확장자(.jpg, .tif, .tiff)만 추출하는 방법을 소개합니다.


1. 사용 예제 시나리오

  • MultipartFile로 ZIP 파일이 서버에 전달됨
  • ZIP 내부에 폴더 구조가 있을 수 있음 → 폴더 경로 제거
  • 특정 이미지 확장자만 필터링
  • 파일 바이트 배열로 읽어서 후속 처리 가능

2. 핵심 구현 코드

import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public void extractImagesFromZip(MultipartFile multipartFile) throws IOException {
    String originalName = multipartFile.getOriginalFilename();

    // ZIP 파일인지 확인
    if (originalName != null && originalName.toLowerCase().endsWith(".zip")) {
        try (ZipInputStream zis = new ZipInputStream(multipartFile.getInputStream())) {
            ZipEntry entry;
            while ((entry = zis.getNextEntry()) != null) {
                if (!entry.isDirectory()) {
                    String entryName = entry.getName();
                    System.out.println("ZIP 내부 파일 경로: " + entryName);

                    // 폴더 경로 제거 → 순수 파일명 추출
                    String fileNameOnly = entryName.substring(entryName.lastIndexOf('/') + 1);
                    String lowerName = fileNameOnly.toLowerCase();

                    // JPG, TIF, TIFF 파일만 추출
                    if (lowerName.endsWith(".jpg") || lowerName.endsWith(".tif") || lowerName.endsWith(".tiff")) {
                        byte[] fileBytes = zis.readAllBytes();
                        // TODO: 여기서 fileBytes를 저장하거나 처리하는 코드 작성
                        System.out.println("추출된 파일명: " + fileNameOnly + ", 크기: " + fileBytes.length + " bytes");
                    }
                }
                zis.closeEntry();
            }
        }
    }
}

3. 코드 설명

  1. ZIP 여부 확인
    • 파일명 확장자가 .zip인지 체크 후 처리.
  2. ZipInputStream 사용
    • ZIP 내부의 파일들을 하나씩 순회.
  3. 폴더 경로 제거
    • entry.getName()폴더명/파일명 형태일 수 있음.
    • lastIndexOf('/')를 이용해 파일명만 추출.
  4. 확장자 필터링
    • .jpg, .tif, .tiff만 추출.
  5. 바이트 배열로 읽기
    • zis.readAllBytes()를 통해 메모리로 로드, 이후 저장/가공 가능.

4. 활용 팁

  • 압축 내 파일이 많거나 용량이 클 경우, 스트리밍 방식이나 임시 파일 저장 방식을 고려.
  • 비즈니스 로직(저장, 변환)은 extract 메서드 밖에서 수행하는 것이 유지보수에 유리.

✅ 이 방법을 사용하면 웹에서 업로드된 ZIP 파일을 간단히 해제하고 원하는 형식만 골라 처리할 수 있습니다.


profile
개발기록장

0개의 댓글