将图像文件夹上载到Firestore存储并将下载URL放入Firestore

时间:2018-03-29 13:04:04

标签: javascript firebase google-cloud-firestore firebase-storage

我有大约10,000张图片要上传到Firebase存储(它总计大约800mb)。

使用Javascript,我正在寻找一种方法:

  1. 将其上传到Firebase存储
  2. 上传后抓取他们的网址,并使用名为“downloadURL”的字段或类似我的网站可用于标记的字段为每个人创建Cloud Firestore文档。
  3. 所以说一个文件是4670.jpg。我想上传文件,获取其持久性URL,然后创建一个名为4670的Cloud Firestore文档,该文档具有带有持久URL的文本字段。我知道如何为单个文件执行此操作,但我正在处理数千个文件。

    编辑:非常感谢,Renaud Tarnec给了我一个有效的解决方案

    HTML

    // File selector
    
    <input type="file" multiple onchange="processSelectedFiles(this)">
    
    // CDN for Firebase, Cloud Firestore, and Firebase Storage
    <script src="https://www.gstatic.com/firebasejs/4.12.0/firebase.js"></script>
    <script src="https://www.gstatic.com/firebasejs/4.11.0/firebase-firestore.js"></script>
    <script src="https://www.gstatic.com/firebasejs/4.12.0/firebase-storage.js"></script>
    
    <script>
      // Initialize Firebase
      var config = {
        apiKey: "********************",
        authDomain: "********************",
        databaseURL: "********************",
        projectId: "********************",
        storageBucket: "********************",
        messagingSenderId: "********************"
      };
      firebase.initializeApp(config);
    
    
    var db = firebase.firestore();
    
    </script>
    
    <script src="script.js"></script>
    

    的Javascript

    function processSelectedFiles(fileInput) {
      var files = fileInput.files;
    
      var promises = []
    
      for (var i = 0; i < files.length; i++) {
    
        var file = files[i] 
    
          promises.push(uploadAndSavePromise(file))
      }
    
        Promise.all(promises);
    }
    
    function uploadAndSavePromise(file) {
         var storageRef = firebase.storage().ref();
         var fileName = file.name
         // Remove extension
         var trimmedFileName = fileName.slice(0, -4)
    
         var imageRef = storageRef.child('test/'+fileName);
    
        return imageRef.put(file).then(function(snapshot) {
    
            db.collection("maincollection").doc(trimmedFileName).set({
            imageURL: snapshot.downloadURL,
    
    })
    
    });
    
    }
    

1 个答案:

答案 0 :(得分:2)

您说您知道如何处理单个文件。

你可能有一个基于promises的进程,它的作用类似于(在伪代码中):

({Upload_to_Firebase_Storage_Promise})
.then(function(urlOfFile) {
    {create__Firestore_doc_Promise}
})
.catch(....)

你应该做的是使用Promise.all()遵循这种模式(混合使用JavaScript和伪代码):

var promises = [];

{forEach file to upload} (
  //Create a Promise that upload the file and save the url and add this promise to the array, as follow
  promises.push(uploadAndSavePromise(fileToUpload))
)

//and call    
Promise.all(promises);

其中uploadAndSavePromise是实现初始承诺链的函数:

function uploadAndSavePromise(file) {
    return ({Upload_to_Firebase_Storage_Promise(file)})
    .then(function(urlOfFile) {
        {create__Firestore_doc_Promise}
    });
}

现在,我要考虑的一件事是,如果你想连续上传10000张图片,这是怎么回事......