포스트

Final (12)

이미지 업로드 TS

1. 문제점

현재 문제점은 이미지를 수정하게 되면 새롭게 이미지를 업로드 하는 방식으로 이루어 진다.

그러다보니 Storage에 불필요한 데이터가 계속 쌓이게 되고, 이는 서버 용량에도 부담이 된다.

그래서 이를 개선하기 위해 이미지를 수정하게 될 경우 파일 값을 일정하게하여 덮어씌우는 방식으로 하려고한다.

2. 이미지 업로드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
func uploadImage(image: UIImage) -> AnyPublisher<String, Error> {
        Future<String, Error> { promise in
            let storageRef = Storage.storage().reference()
            guard let imageData = image.jpegData(compressionQuality: 0.5) else {
                return
            }
            
            let imageRef = storageRef.child("images/\(UUID().uuidString).jpg")
            imageRef.putData(imageData, metadata: nil) { metadata, error in
                if let error = error {
                    promise(.failure(error))
                    return
                }
                
                imageRef.downloadURL { url, error in
                    if let error = error {
                        promise(.failure(error))
                    } else if let downloadURL = url {
                        promise(.success(downloadURL.absoluteString))
                    }
                }
            }
        }
        .eraseToAnyPublisher()
    }

UUID로 되어있던걸 uid+index를 붙여서 진행

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
func uploadImage(image: UIImage, index: Int) -> AnyPublisher<String, Error> {
        Future<String, Error> { promise in
            guard let uid = Auth.auth().currentUser?.uid else { return }
            let storageRef = Storage.storage().reference()
            guard let imageData = image.jpegData(compressionQuality: 0.3) else {
                return
            }
            
            let imageRef = storageRef.child("images/\(uid)\(index).jpg")
            imageRef.putData(imageData, metadata: nil) { metadata, error in
                if let error = error {
                    promise(.failure(error))
                    return
                }
                
                imageRef.downloadURL { url, error in
                    if let error = error {
                        promise(.failure(error))
                    } else if let downloadURL = url {
                        promise(.success(downloadURL.absoluteString))
                    }
                }
            }
        }
        .eraseToAnyPublisher()
    }
    
    func uploadImages(images: [UIImage]) -> AnyPublisher<[String], Error> {
        let publishers = images.enumerated().map { (index, image) in
            uploadImage(image: image, index: index + 1) // 인덱스를 1부터 시작
        }
        return Publishers.MergeMany(publishers)
            .collect()
            .eraseToAnyPublisher()
    }

이렇게되면 현재 유져의 최대 이미지 저장갯수는 5개 이다.

Storage 관리도 완료.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.