xcode “StorageMetadata”类型的值没有成员“downloadURL”

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/50281266/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-15 10:38:51  来源:igfitidea点击:

Value of type 'StorageMetadata' has no member 'downloadURL'

swiftxcodefirebaseswift4firebase-storage

提问by vbuzze

I just updated Firebase Storage to 5.0.0 and it looks like metadata.downloadURL()is not recognized anymore. (Value of type 'StorageMetadata' has no member 'downloadURL')

我刚刚将 Firebase Storage 更新到 5.0.0,但它似乎metadata.downloadURL()不再被识别。( Value of type 'StorageMetadata' has no member 'downloadURL')

Though after looking in the documentation it should still be available :

虽然在查看文档后它应该仍然可用:

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

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

The project was cleaned & rebuilt already.

该项目已经清理和重建。

Am I missing something ?

我错过了什么吗?

回答by Sh_Khan

Can you try

你能试一下吗

// 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'
  }
}

回答by David Seek

This is my version for Swift 3 / Swift 4.

这是我的 Swift 3 / Swift 4 版本。

Explanation of what happens in the code.

解释代码中发生的事情。

This is essentially the same answer as Sh_Khan's. But in his example the User already knows the bucket path. In my example, we get the path from an upload task. This was what has lead me to this question as well as what I think op was looking for as he was looking for metadata.downloadURL()replacement.

这基本上与 Sh_Khan 的答案相同。但是在他的示例中,用户已经知道存储桶路径。在我的示例中,我们从上传任务获取路径。这就是导致我提出这个问题的原因,也是我认为 op 在寻找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)
    }

}

回答by Soeng Saravit

Let's try this code in Swift 4.2:

让我们在 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 方法:

` 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)!)")
            })
        }
    }
}

回答by Rowland Mtetezi

This question pops up for all language searches. Hence for Kotlin, the solution is something of the kind below:

所有语言搜索都会弹出这个问题。因此对于 Kotlin,解决方案如下:

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

// Code ommited - Do some saving - putFile

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

However, this is not a good solution. You are better off saving the path and then re-constructing the full Url on demand. For example:

然而,这不是一个好的解决方案。您最好保存路径,然后根据需要重新构建完整的 Url。例如:

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

Now, you can use it later, and only on demand:

现在,您可以稍后使用它,并且仅在需要时使用:

FirebaseStorage.getInstance().reference.child(product.imageUrl).downloadUrl
                    .addOnSuccessListener { uri ->
                        String imageUrl = uri.toString()
                        // Load in images
                    }

回答by Alexandr Bardashevsky

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)
            }
        })
    }

回答by Ahmadiah

If you are stuck in converting URL to string... you can try this

如果您在将 URL 转换为字符串时遇到困难...您可以试试这个

url.absoluteString