Сохранить два разных изображения одновременно на базе Firebase - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь сохранить два разных изображения одновременно в одном месте хранения

Это моя функция сохранения информации

var text: String = ""
var addedByUser: String?
var userImage: UIImage?
var jobImage: UIImage!
var downloadURL: String?
var userDownloadURL: String?
let ref: DatabaseReference!

init(text: String? = nil, jobImage: UIImage? = nil, addedByUser: String? = nil, userImage: UIImage? = nil) {
    self.text = text!
    self.jobImage = jobImage
    self.addedByUser = addedByUser
    self.userImage = userImage
    ref = Database.database().reference().child("jobs").childByAutoId()
}

init(snapshot: DataSnapshot){
    ref = snapshot.ref
    if let value = snapshot.value as? [String : Any] {
        text = value["text"] as! String
        addedByUser = value["addedByUser"] as? String
        downloadURL = value["imageDownloadURL"] as? String
        userDownloadURL = value["imageUserDownloadURL"] as? String
    }
}

func save() {
    let newPostKey = ref.key

    // save jobImage
    if let imageData = jobImage.jpegData(compressionQuality: 0.5) {
        let storage = Storage.storage().reference().child("jobImages/\(newPostKey)")

        storage.putData(imageData).observe(.success, handler: { (snapshot) in
            self.downloadURL = snapshot.metadata?.downloadURL()?.absoluteString
            let postDictionary = [
                "imageDownloadURL" : self.downloadURL!,
                "imageUserDownloadURL" : self.userDownloadURL!,
                "text" : self.text,
                "addedByUser" : self.addedByUser!
                ] as [String : Any]
            self.ref.setValue(postDictionary)
        })
    }
}

Я попробовал следующий код

if let imageData = jobImage.jpegData(compressionQuality: 0.5), ((userImage?.jpegData(compressionQuality: 0.5)) != nil) {

Но это не работает, так как в базе данных ничего не сохраняется ...

У вас есть идеи, как я могу это решить?

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Я считаю, что вопрос заключается в том, как загрузить изображение в два разных места. Непонятно, почему существует функция наблюдения, поэтому этот ответ игнорирует ее, поскольку она может и не понадобиться.

Начиная с вашего кода, ваша функция сохранения будет выглядеть так

func save() {
   self.uploadImageTask(imageName: "my_image.png", toLocation: "jobImage")
   self.uploadImageTask(imageName: "my_image.png", toLocation: "anotherLocation")
}

, а затем функция загрузки

func uploadImageTask(imageName: String, toLocation: String) {
    let theImage = UIImage(named: imageName) //set up your image here
    let data = UIImagePNGRepresentation(theImage)! //we're doing a PNG
    let storage = Storage.storage()
    let storageRef = storage.reference()
    let locationRef = storageRef.child("images").child(toLocation)
    let imageLocationRef = locationRef.child(imageName)

    // Upload the file to the path "images/location/imageName"
    let uploadTask = locationRef.putData(data, metadata: nil) { (metadata, error) in
        guard let metadata = metadata else {
            print("error while uploading")
            return
        }
        let size = metadata.size // Metadata contains file metadata such as size, content-type.
        print(size)
        locationRef.downloadURL { (url, error) in
            guard let downloadURL = url else {
                print("an error occured after uploading and then downloading")
                return
            }
            let x = downloadURL.absoluteString
            print(x) //or build a dict and save to Firebase
        }
    }
}

результат - изображение, сохраненное в

/images/jobImage/my_image.png
/images/anotherLocation/my_image.png

и он также напечатает путь к каждому изображению, которое может быть сохранено в Firebase.

0 голосов
/ 07 января 2019
let refDatabase = Database.database().reference()
let refstorage = Storage.storage().reference()
let data = image.jpegData(compressionQuality: 1.0) //
let metadata = StorageMetadata()
metadata.contentType = "image/jpeg"
let postkey = refDatabase.child("Post").childByAutoId().key
let imagename = "PostImage/\(postkey).jpeg"
refstorage = refstorage.child(imagename)
let timestamp = Date().timeIntervalSince1970 // you can use this to track time when it was uploaded.
self.refstorage?.putData(data!, metadata: metadata, completion: { (meta, error) in

    if error == nil{
        if let imageData = meta?.downloadURL()?.absoluteString{
            let postDictionary = [
                "imageDownloadURL" : self.downloadURL!,
                "imageUserDownloadURL" : self.userDownloadURL!,
                "text" : self.text,
                "addedByUser" : self.addedByUser!
                ] as [String : Any]
            self.refDatabase.child("Image").child(postkey).updateChildValues(postDictionary)
        } else {
            print("Couldn't get the URL for image")
        }
    }

})

Я не уверен, как выглядит база данных Firebase, поэтому внесите соответствующие изменения в ключи ..

...