Spring boot Controller Zip 압축 해제

2023. 1. 25. 17:31·Java/Spring Boot

회사 프로젝트를 진행하다가 MultipartFile로 전달받은 Zip 파일을 처리하는 방법을 알아보았다.

Spring 게시판도 얼른 마무리 지어야하는데 회사업무 처리하는데 급급하다가

나태지옥에 빠져버려 아직도 손도 못대고 있다... 정신 차려야지 ㅠㅠ

 

✅Controller

우선 Controller에서 Zip 파일을 받아본다.

@RestController
public class IfElb008Controller {

	@PostMapping("/ifElb008")
	public Map<String, Object> scanImage(@RequestPart MultipartFile files) {
		
		return map;
	}
}

평소와 같이 @RequestBody, @RequestParam을 사용하는 것이 아니라

@RequestPart를 사용하여 MultipartFile을 받아준다.

 

 

✅Unzip logic

그리고 Controller 안에 압축 해제 로직을 추가해준다.

public static void unzipFile(Path sourceZip, Path targetDir) {
    try (ZipInputStream zis = new ZipInputStream(new FileInputStream(sourceZip.toFile()))) {
        ZipEntry zipEntry = zis.getNextEntry();
        while (zipEntry != null) {
            boolean isDirectory = false;
            if (zipEntry.getName().endsWith(File.separator)) {
                isDirectory = true;
            }
            Path newPath = zipSlipProtect(zipEntry, targetDir);
            if (isDirectory) {
                Files.createDirectories(newPath);
            } else {
                if (newPath.getParent() != null) {
                    if (Files.notExists(newPath.getParent())) {
                        Files.createDirectories(newPath.getParent());
                    }
                }
                Files.copy(zis, newPath, StandardCopyOption.REPLACE_EXISTING);
            }
            zipEntry = zis.getNextEntry();
        }
        zis.closeEntry();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public static Path zipSlipProtect(ZipEntry zipEntry, Path targetDir) throws IOException {
    Path targetDirResolved = targetDir.resolve(zipEntry.getName());
    Path normalizePath = targetDirResolved.normalize();
    if (!normalizePath.startsWith(targetDir)) {
        throw new IOException("Bad zip entry: " + zipEntry.getName());
    }
    return normalizePath;
}

압축을 해제하기 위해서는 로컬 혹은 서버에 다운로드를 받아야 하기 때문에 다운로드 받는

로직 또한 구현해 준다.

 

✅File download

@Service
public class IfElb008ServiceImpl implements IfElb008Service {
	
	@Override
	public void uploadFile(MultipartFile file) throws IOException {
		file.transferTo(new File("여기에 url" + file.getOriginalFilename()));
	}
}

파일 다운로드는 Service를 따로 만들어서 넣어줬다.

 

✅최종

@RestController
public class IfElb008Controller {

	@Autowired
	private IfElb008Service ifElb008Service;

	@PostMapping("/ifElb008")
	public Map<String, Object> scanImage(@RequestPart MultipartFile files) {
		try {
            String fileName = url + files.getOriginalFilename();
            // zip 파일 저장 후 압축 해제
            ifElb008Service.uploadFile(files);
            unzipFile(Paths.get(fileName), Paths.get(url));
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 리턴값은 알아서
        return null;
	}
}

이렇게 하면 전달받은 Zip 파일을 저장한 뒤 압축을 해제할 수 있다.

저작자표시 비영리 (새창열림)

'Java > Spring Boot' 카테고리의 다른 글

Spring boot Interceptor Ajax 체크 (Redirect 이슈)  (0) 2023.04.05
Spring boot RestAPI 파일 다운로드  (0) 2023.02.10
Spring boot H2 DB 설정  (0) 2022.11.10
[Spring boot + React] Rest Api 연동하기  (0) 2022.08.16
Spring boot Scheduler 구현하기  (0) 2022.06.07
'Java/Spring Boot' 카테고리의 다른 글
  • Spring boot Interceptor Ajax 체크 (Redirect 이슈)
  • Spring boot RestAPI 파일 다운로드
  • Spring boot H2 DB 설정
  • [Spring boot + React] Rest Api 연동하기
요술공주밍키
요술공주밍키
조금씩이라도 꾸준히..
  • 요술공주밍키
    삽질의흔적
    요술공주밍키
  • 전체
    오늘
    어제
    • 분류 전체보기 (139)
      • Java (42)
        • Spring Boot (14)
        • Spring Boot 게시판 (14)
        • 공중화장실 찾기 (4)
        • 쇼핑몰 (8)
      • JavaScript (8)
        • NodeJS (2)
      • Python (5)
        • Django (4)
      • Server (10)
        • Docker (4)
        • K8S (0)
        • Jenkins (1)
      • 알고리즘 (24)
        • 프로그래머스 (19)
        • 백준 (5)
      • Etc (21)
        • 개발 팁 (1)
      • 일상 (27)
        • 독서 포스트 (25)
        • 회고록 (2)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
요술공주밍키
Spring boot Controller Zip 압축 해제
상단으로

티스토리툴바