我有大约10,000张图片要上传到Firebase存储(它总计大约800mb)。
使用Javascript,我正在寻找一种方法:
所以说一个文件是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,
})
});
}
答案 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张图片,这是怎么回事......