简体   繁体   中英

How to upload audio file to Firebase Storage?

I'm trying to upload audio file to Firebase Storage in my Ionic2 project.

First I recorded a audio file using Media plugin (Cordova plugin), and this file is playing well. From the Android storage and from the media plugin method (this.media.play()...;).

Second I need to push the recorded file to Firebase Storage.

this is my code:

  let storageRef = firebase.storage().ref();
  let metadata = {
     contentType: 'audio/mp3',
   };
  let filePath = `${this.file.externalDataDirectory}`+`${this.fileName}`;
  const voiceRef = storageRef.child(`voices/${this.fileName}`);  
  var blob = new Blob([filePath], {type: 'audio/mp3'});
  voiceRef.put(blob);

After reading the Firebase doc, I can push blob to Firebase.

The file is successfully pushed to Firebase Storage with empty data (95 Byte).

this is screenshot: 在此处输入图片说明

The problem isn't a Firebase issue

My problem is solved by using the File cordova plugin method ( readAsDataURL() ) and the putString(fileBase64,firebase.storage.StringFormat.DATA_URL) method.

First, I create a file reference: let filePath = "this.file.externalDataDirectory" + "this.fileName";

Then I transform the file to a base64 string by using the readAsDataURL method that returns a promise containing the file as a string base64. Also, I push the file to Firebase using the putString method that has two parameters the File that returned by the readAsDataURL and the second is firebase.storage.StringFormat.DATA_URL.

My Final code:

  let storageRef = firebase.storage().ref();
  let metadata = {
    contentType: 'audio/mp3',
  };
  let filePath = `${this.file.externalDataDirectory}` + `${this.fileName}`;
  this.file.readAsDataURL(this.file.externalDataDirectory, this.fileName).then((file) => {
    let voiceRef = storageRef.child(`voices/${this.fileName}`).putString(file, firebase.storage.StringFormat.DATA_URL);
    voiceRef.on(firebase.storage.TaskEvent.STATE_CHANGED, (snapshot) => {
      console.log("uploading");
    }, (e) => {
      reject(e);
      console.log(JSON.stringify(e, null, 2));
    }, () => {
      var downloadURL = voiceRef.snapshot.downloadURL;
      resolve(downloadURL);
    });
  });

That's working fine for me. Thanks.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM