Base64는 이미지 업로드, 프론트 백엔드 통신, 파일 임베드를 할 때 필수적인 기술이다.
오늘 정리한 코드를 활용하면 java로 쉽게 base64 이미지를 내가 원하는 폴더에 저장할 수 있다.
Base64란?
base64는 이진 데이터를 텍스트로 바꾸는 인코딩 방식이다.
네트워크나 텍스트 기반 시스템(json,xml) 등에서는 순수 이진 데이터 전송이 어려운데 base64는 이진 데이터를 문자열 형태로 안전하게 변환해 준다.
단점으로는 원래 크기보다 약 33프로 정도 데이터 크기가 증가하며 바이너리 처리보다 성능은 떨어지는 편이다.
data:image/png;base64,iVBORw0KGgoAAAANRTYDDA...
image/png;base64, 는 메타정보는 의미하며 콤마 뒤에 값은 인코딩 된 이미지 데이터를 의미한다.
Java 코드: Base64 문자열을 이미지 파일로 저장하기
import java.io.*;
import java.nio.file.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Base64;
public class ImageSaver {
public static String saveBase64ImageFile(String base64String) throws IOException {
String midId = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
String extension = "jpg";
String base64Data = base64String;
if (base64String.startsWith("data:")) {
int slashIndex = base64String.indexOf('/');
int semicolonIndex = base64String.indexOf(';');
if (slashIndex != -1 && semicolonIndex != -1) {
extension = base64String.substring(slashIndex + 1, semicolonIndex);
}
base64Data = base64String.substring(base64String.indexOf(",") + 1);
}
String year = midId.substring(0, 4);
String month = midId.substring(4, 6);
String day = midId.substring(6, 8);
String dirPath = "resource/media/image/" + year + "/" + month + "/" + day;
Files.createDirectories(Paths.get(dirPath));
String fileName = midId + "." + extension;
String fullPath = dirPath + "/" + fileName;
byte[] imageBytes = Base64.getDecoder().decode(base64Data);
try (OutputStream out = new FileOutputStream(fullPath)) {
out.write(imageBytes);
System.out.println("이미지 저장 완료: " + fullPath);
}
// 저장된 전체 경로 리턴
return fullPath;
}
}
String midId = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
현재 시간을 기반으로 파일명이 되는 Id를 생성한다.
if (slash != -1 && semi != -1) {
extension = base64String.substring(slash + 1, semi);
}base64Data = base64String.substring(base64String.indexOf(",") + 1);
메타정보에서 확장자와 순수 이미지 데이터를 추출한다.
String dirPath = "/media/image/" + year + "/" + month + "/" + day;
Files.createDirectories(Paths.get(dirPath));
생성된 id로 년/월/일 날짜 경로를 만든 후 폴더를 생성한다.
byte[] imageBytes = Base64.getDecoder().decode(base64Data);
OutputStream out = new FileOutputStream(fullPath)
out.write(imageBytes);
디코딩 후 이미지를 해당 경로에 저장한다.
사용 예시
String savedPath = ImageSaver.saveImageFileAndReturnPath(
"data:image/png;base64,iVBORw0KGgoAAAANRTYDDA..."
);
System.out.println("저장된 경로: " + savedPath);