当前位置: 首页 > 知识库问答 >
问题:

Firebase-是否可以在数据库节点下上传照片,而不是在存储中?

汪翰墨
2023-03-14

我正在做一个离子项目,在这个项目中,我想上传照片,并将它们添加到Firebase存储中的特定节点。现在我所做的是在存储中上传照片。
我想做的是不在存储中上传这些照片,而是在节点中引用它们,如下所示:

我已经手动完成了在imgur上传照片并复制链接,但我需要一个自动程序来让用户上传照片到特定的城市。
假设用户在一个城市,拍了一张照片并上传到Firebase上。通过将其上传到存储中,可以获得他所在的cityname,并通过调用它来添加一张新照片,例如“username_cityname_photo”。但是,由于一个用户可以在不同的时间html" target="_blank">上传同一城市的多张照片,我如何轻松地上传一张新照片而不覆盖已经在存储区的照片?
出于这个原因,我想知道是否有一种方法可以不在存储区上传照片,而是直接在数据库上传照片,例如生成一个引用URL,这样每一张新照片都可以简单地附加在相应的节点下。

共有1个答案

洪高刚
2023-03-14

所以你可以上传一个图像到Firebase数据库,但它必须是二进制或一些奇怪的东西,这通常是不被接受的做法。为了使这些URL在存储中唯一,您可以在CityName->autoIdKey下上传它们,这将是唯一的。这也意味着一个城市的所有图像都将在它的名字下存储,这可能会方便以后。

您可以使用以下代码获取当前用户所在城市

import Foundation
import MapKit

typealias JSONDictionary = [String:Any]

class LocationServices {

    let shared = LocationServices()
    let locManager = CLLocationManager()
    var currentLocation: CLLocation!

    let authStatus = CLLocationManager.authorizationStatus()
    let inUse = CLAuthorizationStatus.authorizedWhenInUse
    let always = CLAuthorizationStatus.authorizedAlways

    func getAdress(completion: @escaping (_ address: JSONDictionary?, _ error: Error?) -> ()) {

        self.locManager.requestWhenInUseAuthorization()

        if self.authStatus == inUse || self.authStatus == always {

            self.currentLocation = locManager.location

            let geoCoder = CLGeocoder()

            geoCoder.reverseGeocodeLocation(self.currentLocation) { placemarks, error in

                if let e = error {

                    completion(nil, e)

                } else {

                    let placeArray = placemarks as? [CLPlacemark]

                    var placeMark: CLPlacemark!

                    placeMark = placeArray?[0]

                    guard let address = placeMark.addressDictionary as? JSONDictionary else {
                        return
                    }

                    completion(address, nil)

                }

            }

        }

    }

}

函数获取城市名称:

    func getCityName() -> String {
        LocationServices.shared.getAdress { address, error in
            if let a = address, let city = a["City"] as? String {
                   return city
            }
            else {
                return "NO_CITY_NAME"
            }
        }
    }
@IBAction func postPressed(_ sender: Any) {

        // get the cityname
        let city = getCityName()
        let uid = Auth.auth().currentUser!.uid
        let ref = Database.database().reference()
        let storage = Storage.storage().reference(forURL: "gs://YourUrlHere")
        let key = ref.child("pois").childByAutoId().key // unique key

        let imageRef = storage.child("pois").child(city).child("\(key).jpg")

        let data = UIImageJPEGRepresentation(photo, 0.6) 

        let uploadTask = imageRef.putData(data!, metadata: nil) { (metadata, error) in
            if error != nil {
                // do something
                return
            }

            imageRef.downloadURL(completion: {(url, error) in
                // upload of image worked now get the url to upload to your database

                if let url = url, let author = Auth.auth().currentUser?.displayName {
                    let feed = ["city": ,
                                "pathToImage": url.absoluteString, // here is your storage url to upload to Firebase DB
                                : key] as [String: Any]

                    let postFeed = ["\(key)" : feed]

                    ref.child("pois").updateChildValues(postFeed, withCompletionBlock: { (error, success) in
                        if error != nil {
                            // do something
                            return
                        }
                        else {
                            // data successfully uploaded
                        }            
                    })
                }
            })
        }
        uploadTask.resume()

        uploadTask.observe(.success) { (snapshot) in
            // do something when upload is finished
            return
        }
        uploadTask.observe(.failure) { (snapshot) in
            // do something on failure
            return
        }
}
 类似资料:
  • 我试图构建一个,它包括两个按钮,一个用于用相机拍照并上传到Firebase存储,另一个用于从Firebase存储下载图像并在上显示。 现在,我被上传功能卡住了。我可以把照片保存到应用程序目录中。我想上传保存的图片到Firebase存储。

  • 问题内容: 在这里很难说出要问什么。这个问题是模棱两可,含糊不清,不完整,过于宽泛或夸张的,不能以目前的形式合理地回答。如需帮助澄清此问题以便可以重新打开, 请访问帮助中心。 8年前关闭。 是否可以在SQL数据库(或任何其他数据库)中存储图片,声音,视频?如果是,应该是什么格式,请详细说明必须配置的特殊设置(如果有)。提前致谢。 问题答案: 在MySQL中,您可以使用列的BINARY或VARBIN

  • 我在这个模块中的主要目标是将用户的个人资料图片上传到Firebase存储库中,并将照片URL存储到Firestore(云Firestore)中。 注: 我上载的图像只有JPG和PNG格式。 这是跨平台应用程序,使用离子和角 null update-profile.component.html

  • 我有两个关于Firebase实时数据库的重要问题(对于带有java的android)。 遵守以下结构: 我有以下课程: 为了搜索用户的数据(姓名、年龄、地区和肤色),我做到了: 问题1:在进行搜索时,firebase是只下载用户数据(除了消息节点)还是也下载消息节点中的数据? 想象一下,消息节点中有数百万条消息,进行此搜索,是否也会下载数百万条消息?为什么消息节点在用户节点内? 我只想要数据名称、

  • 我正在eclipse中使用模拟器。我在模拟器中提取了大约2200条文本消息/data/data/com.android.providers.telephony/databases/mmssms。从emulator中读取db,并在其中看到文本消息 SQLiteDatabase smsDB=SQLiteDatabase.openDatabase("/data/data/com.android.prov

  • 我有一个表单,如果我使用存储文件,是整个文件内容存储在数据库还是只是文件路径? 假设我有几十万或几百万个文件。因为表的大小必须很大,所以将它们存储在数据库中是否有效? 如果我不想把它们存储在数据库中,简单的上传并保存在本地文件系统中,有没有办法得到所有文件名的列表?通过将它们存储在数据库中,我只需通过以下方式获得: 谢谢