如何将图像上传到firebase存储并在单个事务中保存数据库中的引用?

时间:2017-10-30 09:56:24

标签: firebase firebase-realtime-database firebase-storage

我想将图片上传到firebase存储并保存firebase数据库中的链接。保存到数据库的链接可能因任何原因失败,然后我在存储中有未使用的,未链接的图像。是否有可能以某种方式确保上传链接到图像后保存在数据库中?

4 个答案:

答案 0 :(得分:1)

是的,您可以在此任务中使用addOnSuccessListener

uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
    @Override
    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
        Uri downloadUrl = taskSnapshot.getDownloadUrl();
        firebaseRef.child("urls").child("urlId1").setValue(downloadUrl.toString);
    }
});

这意味着只有在上传成功后,您才会将URL写入数据库。

答案 1 :(得分:1)

这是除了使用事务之外的另一种方法。您可以使用Firebase云功能存储触发器。您可以编写云功能来获取上传图像的下载URL,然后将其推送到firebase数据库。

Check this video by firebase about Cloud Function Storage Trigger

答案 2 :(得分:1)

我建议您等待图片上传到firebase中,从storageRef获取URL,然后将Url推送到数据库中,如下所示。 我使用javascript方法,希望您能了解如何满足您的需求。

<input type="file" value="" name="Photo" class="btn btn-info" id="fileButton" accept="image/*"> //html Code

在js文件中,添加类似

的事件监听器
var fileButton = document.getElementById('fileButton');
fileButton.addEventListener("change",function(e){
   var file= e.target.files[0];
   //create storage ref to the firebase storage
   var storageRef = firebase.storage().ref('your Path Name').child(file.name);
   var task = storageRef.put(file);
   task.on("state_changed",function(snapshot){
      var percentage= snapshot.bytesTransferred/snapshot.totalBytes) *100;
      if(percentage==100){
          storageRef.getDownloadURL().then(function (url) {
             // You will get the Url here.
            var firebaseRef=firebase.database().ref("Your path Name);
            firebaseRef.push(url).then(function(){
              alert("Image Uploaded and also updated to the database");
           });
          });
      }
   });
});

我希望这对您有所帮助,这种情况发生在一次交易中。

答案 3 :(得分:1)

这种模式怎么样?

  1. 将文件保存在云存储中的生命周期为1天的存储桶中。我们可以称其为时间桶。
  2. 将该网址保存到您的数据库中。
  3. 具有适当的云功能,可将对象从临时存储桶移动到永久存储桶。一旦对象位于永久存储桶中,该函数就可以替换数据库中的url。

因此,在无法将网址保存到数据库的情况下,该对象将在1天后被删除