HelloWorld
HelloWorld

Reputation: 1863

How to ensure file integrity in Google Cloud Firebase Storage?

I am writing a web service where users can upload and download files to their user directory in Google Cloud Firebase Storage.

Imagine a user uploads a 1GB file to the storage. While the user uploads the file, it is already visible by other "processes".

What are common techniques to identify a file being uploaded 100% from a process that does not have the upload stats?

One approach in a local environment would be to call the file first "my-file.iso.tmp" and later rename them by removing the suffix, since a rename operation is atomic. But that doesn't seem to be a suitable solution for my Firebase Storage problem.

Any insights are highly appreciated!

Upvotes: 0

Views: 155

Answers (1)

Dharmaraj
Dharmaraj

Reputation: 50920

There isn't any method to rename a file in Firebase storage. If you want to show realtime upload stats across all user's devices then using realtime database could be a way.

var uploadTask = storageRef.child('images/rivers.jpg').put(file);

uploadTask.on('state_changed', 
  async (snapshot) => {
    var progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
    console.log('Upload is ' + progress + '% done');
    await updateUploadStatus(progress)
    }
  }, 
  (error) => {
    // Handle unsuccessful uploads
  }, 
  () => {
    // Upload completed
    await uploadStatus(100)
    uploadTask.snapshot.ref.getDownloadURL().then((downloadURL) => {
      console.log('File available at', downloadURL);
    });
  }
);

async function updateUploadStatus(progress) {
  const dbRef = firebase.database().ref(`users/${userID}/${fileID}`)
  await dbRef.update(progress)
}

The updateUploadStatus will update progress to realtime database and you can listen it on all other devices where user has logged in (and is active) as follows:

var fileRef = firebase.database().ref(`users/${userID}/${fileID}`);
fileRef.on('value', (snapshot) => {
  const data = snapshot.val();
  updateFileProgress(data);
});

It's upto you how you get that fileID on other devices or you could listen to users/${userID} node itself. While the progress is not 100 percent you can grey out that file icon or something like that.

Upvotes: 1

Related Questions