타임캡슐마다 번호가 있는데 S3에서 해당 번호 타임캡슐에서 카드를 저장하거나 파일을 올리면 S3에 timecapsule/{타입캡슐 번호}/file/{파일이름} 이렇게 저장되길 원했다.

나중에 타임캡슐을 열어서 파일을 다운로드 받으려면 해당 타임캡슐에서만 받아야하는데 파일을 zip으로 묶어서 다운로드 받으려다보니 타임캡슐마다 폴더를 만들어야 한다는 문제가 생겼었다.

기존에는 그냥 s3에 통으로 올리고있어서 문제가 생겼는데 이제는 분리를 해야했다.

그래서 업로드시에 해당 경로를 지정해주었다.

public String fileSaveFile(MultipartFile multipartFile, Long timecapsuleNo) throws IOException {
        String originalFilename = multipartFile.getOriginalFilename();
        String extension = originalFilename.substring(originalFilename.lastIndexOf(".")); // 파일 확장자

        // 파일 확장자가 맞지 않으면
        if (!isValidExtensionFile(extension)) {
            throw new CommonException(CustomExceptionStatus.EXTENSION_ERROR_FILE);
        }

        LocalDateTime current = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm-ss");
        String formatted = current.format(formatter);

        String newFilename = "timecapsule/" + timecapsuleNo + "/file/" + formatted + multipartFile.getOriginalFilename(); // 랜덤한 문자열과 확장자를 합쳐서 새 파일명 생성

        ObjectMetadata metadata = new ObjectMetadata();
        metadata.setContentLength(multipartFile.getSize());
        metadata.setContentType(multipartFile.getContentType());

        amazonS3.putObject(bucket, newFilename, multipartFile.getInputStream(), metadata);
        return amazonS3.getUrl(bucket, newFilename).toString();
    }

파일을 업로드할 때 타임캡슐의 번호, 파일을 받게 되는데

String newFilename = "timecapsule/" + timecapsuleNo + "/file/" + formatted + multipartFile.getOriginalFilename();

경로를 같이 집어넣어서 newFilename이라는 이름을 만들어서 저장하게 만들었다.

이렇게 하면 S3에 폴더가 없어도 자동으로 생성해서 파일이 저장되게 된다.


사진 다운로드 하는데 자꾸

The specified key does not exist

이 에러가 난다