728x90
개요
프로젝트를 진행하면서 aws S3에 파일을 업로드해야하는 과정이 있었습니다.
S3 버킷에 잘 업로드 된 것을 확인했고, 요청을 보냈을 때 uploadUrl도 잘나오는데, 확장자가 빠져있었습니다.
확장자가 없기 때문에 uploadUrl로 접속하여 다운을 받고, 해당 파일을 확인하면 위와 같은 에러 발생가 발생합니다.
문제 원인
이유는 S3에 파일을 업로드할 때 원본 파일의 확장자를 유지하지 않아서 발생한 것입니다.
문제 코드
@SneakyThrows
public String uploadMultiMedia(Long userId, MultipartFile file) {
String uploadUrl = "";
// 사용자 별 년도 월 일로 데이터 관리
String key = userId + "/" + LocalDateTime.now().getYear() + "/" + LocalDateTime.now().getMonthValue() + "/" + LocalDateTime.now().getDayOfMonth() + "/" + UUID.randomUUID();
try (InputStream is = file.getInputStream()) {
uploadUrl = s3Operations.upload(s3BucketProperties.getBucket(), key, is).getURL().toString();
} catch (IOException e) {
throw new GlowGlowException(MULTIMEDIA_UPLOAD_FAIL);
}
return uploadUrl;
}
기존 코드에서는 파일 이름 생성 시 원본 파일의 확장자를 포함하지 않았으며, UUID만을 사용하여 파일 이름을 생성했기 때문에 확장자 정보가 누락됐습니다.
이로 인해 S3에 업로드된 파일의 URL에 확장자가 포함되지 않았고, 결과적으로 파일을 다운로드하거나 열 때 문제가 발생했습니다.
문제 해결 코드
// 파일 확장자 추출 메서드
public static String getFileExtension(String fileName) {
int dotIndex = fileName.lastIndexOf('.');
if (dotIndex > 0 && dotIndex < fileName.length() - 1) {
return fileName.substring(dotIndex + 1);
} else {
throw new GlowGlowException(MULTIMEDIA_FILE_EXTENSION_INVALID);
}
}
Util 파일에 파일 확장자 추출 메서드인 getFileExtension() 메서드를 만들어 줍니다. 파일 이름의 마지막 점(.) 위치를 찾아 점 뒤의 문자열(확장자)을 반환하며, 확장자가 없거나 점 위치가 잘못된 경우 GlowGlowException을 발생시킵니다.
@SneakyThrows
public String uploadMultiMedia(Long userId, MultipartFile file, FileUploadType type) {
String uploadUrl = "";
// GlowGrowFileUtil을 사용하여 파일 유효성 검사
String originalFilename = GlowGrowFileUtil.validate(type, file);
String extension = GlowGrowFileUtil.getFileExtension(originalFilename);
// 사용자 별 년도 월 일로 데이터 관리
String key = String.format("%d/%d/%d/%d/%s.%s",
userId,
LocalDateTime.now().getYear(),
LocalDateTime.now().getMonthValue(),
LocalDateTime.now().getDayOfMonth(),
UUID.randomUUID(),
extension);
try (InputStream is = file.getInputStream()) {
uploadUrl = s3Operations.upload(s3BucketProperties.getBucket(), key, is).getURL().toString();
} catch (IOException e) {
throw new GlowGlowException(MULTIMEDIA_UPLOAD_FAIL);
}
return uploadUrl;
}
GlowGrowFileUtil을 사용하여 파일 유효성을 검사하고, 파일 확장자(extension)를 가져와서 키(key) 생성 시 파일 이름에 확장자를 추가했습니다.
'TIL,일일 회고' 카테고리의 다른 글
[TIL, 일일 회고] 2024.10.24 - DTO 설계에서 중첩 클래스 활용의 장단점 분석 (0) | 2024.10.24 |
---|---|
[TIL, 일일 회고] 2024.10.23 - Spring boot Swagger 주요 어노테이션 (0) | 2024.10.23 |
[TIL, 일일 회고] 2024.10.21 - Spring boot 스케줄러 @Schduled (0) | 2024.10.21 |
[TIL, 일일 회고] 2024.10.20 - LocalDate로 정확한 날짜 구하기 (0) | 2024.10.20 |
[TIL, 일일 회고] 2024.10.19 - 데이터베이스 스키마 추가하기 (0) | 2024.10.19 |