Значение типа «StorageMetadata» не имеет члена «downloadURL» - PullRequest
0 голосов
/ 10 мая 2018

Я только что обновил Firebase Storage до 5.0.0, и похоже, что metadata.downloadURL() больше не распознается.(Value of type 'StorageMetadata' has no member 'downloadURL')

Хотя после просмотра документации она все же должна быть доступна:

https://firebase.google.com/docs/reference/swift/firebasestorage/api/reference/Classes/StorageMetadata#/c:objc(cs)FIRStorageMetadata(im)downloadURL

Проект уже очищен и перестроен.

Я что-то упустил?

Ответы [ 6 ]

0 голосов
/ 21 февраля 2019
Auth.auth().createUser(withEmail: email, password: password) { (user, error) in
        if error != nil {
            print(error as Any)
            return
        }
        guard let uid = user?.user.uid else {
            return
        }

        self.dismiss(animated: true, completion: nil)
        //Добавляем картинку в firebase. Надо добавить в Pods file pod 'Firebase/Storage' и запустить терминал
        let imageName = NSUUID().uuidString
        let storageRef = Storage.storage().reference()

        // Create a reference to the file you want to download
        let starsRef = storageRef.child("profile_images").child("\(imageName).png")

        let uploadData = self.profileImageView.image?.pngData()

        starsRef.putData(uploadData!, metadata: nil, completion: { (metadata, error) in
            if error != nil {
                print(error as Any)
            }
            if let profileImageUrl = metadata?.path {
                let values = ["name": name, "email": email, "profileImage": profileImageUrl]
                self.registerUserIntoDatabaseWithUID(uid: uid, values: values)
            }
        })
    }
0 голосов
/ 14 декабря 2018

Давайте попробуем этот код в Swift 4.2:

let imgData = UIImage.jpegData(self.imageView.image!)

let imageName = UUID().uuidString
let ref = Storage.storage().reference().child("pictures/\(imageName).jpg")
let meta = StorageMetadata()
meta.contentType = "image/jpeg"

self.uploadToCloud(data: imgData(0.5)!, ref: ref, meta: meta)

Метод UploadToCloud:

` Method UploadToCloud
func uploadToCloud(data:Data, ref:StorageReference, meta:StorageMetadata) {
    ref.putData(data, metadata: meta) { (metaData, error) in
        if let e = error {
            print("==> error: \(e.localizedDescription)")
        }
        else 
        {
            ref.downloadURL(completion: { (url, error) in
                print("Image URL: \((url?.absoluteString)!)")
            })
        }
    }
}
0 голосов
/ 04 октября 2018

Если вы застряли в преобразовании URL в строку ... вы можете попробовать это

url.absoluteString
0 голосов
/ 31 мая 2018

Этот вопрос всплывает для всех языковых поисков. Следовательно, для Kotlin, решение - что-то вроде ниже:

val photoRef = FirebaseStorage.getInstance()
                .reference.child("images/stars.jpg")

// Code ommited - Do some saving - putFile

    photoRef.downloadUrl.addOnSuccessListener({ uri ->
                         product.imageUrl = uri.toString()
                     })

Однако это не очень хорошее решение. Вам лучше сохранить путь, а затем заново создать полный URL-адрес по требованию. Например:

photoRef.downloadUrl.addOnSuccessListener({ uri ->  
            val imagePath = uri.toString()
            // Save to database
        })

Теперь вы можете использовать его позже, и только по требованию:

FirebaseStorage.getInstance().reference.child(product.imageUrl).downloadUrl
                    .addOnSuccessListener { uri ->
                        String imageUrl = uri.toString()
                        // Load in images
                    }
0 голосов
/ 17 мая 2018

Это моя версия для Swift 3 / Swift 4.

Объяснение того, что происходит в коде.

Это по сути тот же ответ, что и у Ш_Хана. Но в своем примере Пользователь уже знает путь корзины. В моем примере мы получаем путь из задачи загрузки. Именно это привело меня к этому вопросу, а также к тому, что, по-моему, искал оп, когда искал замену metadata.downloadURL().

class StorageManagager {


    private let storageReference: StorageReference

    init() {

        // first we create a reference to our storage
        // replace the URL with your firebase URL
        self.storageReference = Storage.storage().reference(forURL: "gs://MYAPP.appspot.com")
    }

    // MARK: - UPLOAD DATA
    open func uploadData(_ data: Data, named filename: String, completion: @escaping (URL? , Error?) -> Void) {

        let reference = self.storageReference.child(filename)
        let metadata = StorageMetadata()
        metadata.contentType = "ourType" // in my example this was "PDF"

        // we create an upload task using our reference and upload the 
        // data using the metadata object
        let uploadTask = reference.putData(data, metadata: metadata) { metadata, error in

            // first we check if the error is nil
            if let error = error {

                completion(nil, error)
                return
            }

            // then we check if the metadata and path exists
            // if the error was nil, we expect the metadata and path to exist
            // therefore if not, we return an error
            guard let metadata = metadata, let path = metadata.path else {
                completion(nil, NSError(domain: "core", code: 0, userInfo: [NSLocalizedDescriptionKey: "Unexpected error. Path is nil."]))
                return
            }

            // now we get the download url using the path
            // and the basic reference object (without child paths)
            self.getDownloadURL(from: path, completion: completion)
        }

        // further we are able to use the uploadTask for example to 
        // to get the progress
    }

    // MARK: - GET DOWNLOAD URL
    private func getDownloadURL(from path: String, completion: @escaping (URL?, Error?) -> Void) {

        self.storageReference.child(path).downloadURL(completion: completion)
    }

}
0 голосов
/ 10 мая 2018

Можете ли вы попробовать

// Create a reference to the file you want to download
let starsRef = storageRef.child("images/stars.jpg")

// Fetch the download URL
starsRef.downloadURL { url, error in
  if let error = error {
    // Handle any errors
  } else {
    // Get the download URL for 'images/stars.jpg'
  }
}
...