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) 생성 시 파일 이름에 확장자를 추가했습니다.