Alexander lee
Alexander lee

Reputation: 41

storageReference.downloadURL with completion handler... url keeps returning nil

For some reason, when I am using firebase storage to retrieve my download image URL (I have confirmed that the image is actually sent to firebase storage), the url is returning nil. I'm pretty sure my file path matches/is correct but I'm not sure where I'm going wrong on this.

let selectedImageData=UIImageJPEGRepresentation(selectedImage.image!, 1)
    let storageRef=Storage.storage().reference()
    let metadata=StorageMetadata()
    storageRef.child("Users").child(Auth.auth().currentUser!.uid)
        .child("Pictures"+String(self.tracker)).putData(selectedImageData!, metadata: metadata) 
    { 
        (metadata, error) in

        if error != nil{
            print("There was a problem uploading")
            return
        }

        storageRef.child("Users").child(Auth.auth().currentUser!.uid)
            .child("Pictures"+String(self.tracker)).downloadURL(completion: 
        { 
            (url, error) in

            print("What's going on")
            self.pictures.append((url?.absoluteString)!)
        })
    }

Upvotes: 3

Views: 899

Answers (2)

Vicente Garcia
Vicente Garcia

Reputation: 6380

Seems like your reference for putData and for getting downloadURL is different some how, maybe the tracker is changing in the meantime?

To avoid the reference being different let's try changing your code like this:

let selectedImageData=UIImageJPEGRepresentation(selectedImage.image!, 1)
let storageRef=Storage.storage().reference()
let metadata=StorageMetadata()
let reference = storageRef.child("Users").child(Auth.auth().currentUser!.uid).child("Pictures"+String(self.tracker))
reference.putData(selectedImageData!, metadata: metadata) { (metadata, error) in
    if error != nil{
        print("There was a problem uploading")
        return
    }
    reference.downloadURL { (url, error) in
        print("Download error: \(error), url: \(url)")
        self.pictures.append((url?.absoluteString)!)
    }
}

Basically we make sure to use the same reference in both cases.

Upvotes: 0

Yogesh Tandel
Yogesh Tandel

Reputation: 1754

Use the below code to upload image to Storage and get a return path for the image

let selectedImageData=UIImageJPEGRepresentation(selectedImage.image!, 1)
self.uploadProfileImageToFirebase(data: selectedImageData)

func uploadProfileImageToFirebase(data:NSData){

let storageRef = Storage.storage().reference().child("Users").child(Auth.auth().currentUser!.uid).child("Pictures").child(String(self.tracker)) 
//Modify the above line as per your requirement

if data != nil {
    storageRef.putData(data as Data, metadata: nil, completion: { (metadata, error) in
        if(error != nil){
            print(error)
            return
        }

        // Fetch the download URL
        storageRef.downloadURL { url, error in
            if let error = error {
                // Handle any errors
                if(error != nil){
                    print(error)
                    return
                }
            } else {
                // Get the download URL
                let urlStr:String = (url?.absoluteString) ?? ""
                print(urlStr)
            }
        }
    })
}

Upvotes: 1

Related Questions