为什么Firebase存储会覆盖每次上传照片时都应保留所有用户图像的存储?

问题描述 投票:1回答:1

我很确定错误在于设定行中。我以为.key应该可以使写作变得动态起来,但是孩子的photopost每次都会被覆盖。我需要更改什么才能将每个上载存储或覆盖。

class post{
    var imageDownloadURL: String?

    var image: UIImage!

    var caption: String!


    init(image: UIImage, caption: String) {
        self.image = image
        self.caption = caption
    }
    func save() {

        let uid = Auth.auth().currentUser!.uid
        let newPostRef = Database.database().reference().child("people").child(uid).child("PhotoPosts")
        let newPostRef1 = Database.database().reference().child("people").child(uid).child("PhotoPosts1")


        let newPostKey = newPostRef.key


        if let imageData = image.jpegData(compressionQuality: 0.6){

            let imageStorageRef = Storage.storage().reference().child("images")


            let newImageRef = imageStorageRef.child(newPostKey)
            let newImageRef1 = imageStorageRef.child(newPostKey)


            newImageRef.putData(imageData).observe(.success, handler: {(snapshot) in
                self.imageDownloadURL =
                    snapshot.metadata?.downloadURL()?.absoluteString
                newPostRef.setValue(self.imageDownloadURL as Any)


            })



            newImageRef1.putData(imageData).observe(.success, handler: {(snapshot) in
                self.imageDownloadURL = snapshot.metadata?.downloadURL()?.absoluteString

                let keyToPost = Database.database().reference().child("people").child(uid).childByAutoId().key
                let f1: [String: Any] = [(keyToPost) : self.imageDownloadURL as Any]

                newPostRef1.updateChildValues(f1)


                               })


        }

    }


}

这是数据库规则:

    rules_version = '2';
  service firebase.storage {
   match /b/{bucket}/o {
     match /{allPaths=**} {
       allow read, write: if request.auth != null;
     }
  }
 }

注:我知道newimageref1与newimageref指的是同一事物,但是我不认为这在逻辑上会导致覆盖。我很确定那不是造成覆盖的原因。

swift firebase-realtime-database firebase-authentication
1个回答
0
投票

由于您只有一个newPostKey,因此一次只能有一个值。因此,在这两行中,您最终引用了Cloud Storage中的相同位置:

let newImageRef = imageStorageRef.child(newPostKey)
let newImageRef1 = imageStorageRef.child(newPostKey)

并且由于newImageRefnewImageRef1指向相同的位置,所以最后一次写入已覆盖该位置上的所有内容。

我认为您想根据最低级别的数据库密钥写入两个不同的位置,在这种情况下,您需要确保根据各个密钥来设置存储引用。

例如:

let newImageRef = imageStorageRef.child(newPostRef.key)
let newImageRef1 = imageStorageRef.child(newPostRef1.key)
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.