将.ogg blob转换为google驱动器文件

时间:2018-01-15 00:50:51

标签: javascript google-apps-script google-drive-api blob

背景

我想录制学生说话,然后自动将录制内容上传到Google云端硬盘。

目前的事态

我有客户端代码,可以生成包含.ogg录制的blob。

var blob = new Blob(chunks, { 'type' : 'audio/ogg; codecs=opus' });

我可以在doPost()请求中将blob发送到Google应用脚本独立脚本。在这种情况下,我使用具有承诺的axios。

axios.post("https://script.google.com/macros/s/SOME_ID/exec", blob)
  .then((response)=>{
   console.log(response)
  }).catch(error =>{
   console.log(error)
  })

blob到达独立脚本。

独立的Google应用脚本

function doPost(e) {


  var params = JSON.stringify(e.parameters);
  createNewSoundFile(params)
  return ContentService.createTextOutput(params); 
}

function createNewSoundFile(blob){
  var title = 'Was created from a recording'
  var folderId = 'SOME_FOLDER_ID'
  var resource = {
    title: title,
    parents: [
      {
        "id": folderId, 
        "kind": "drive#fileLink"
      }
    ],
    mimeType: 'application/vnd.google-apps.audio', 
  };
  try{

  var newfile = Drive.Files.insert(resource, blob).id

  } catch(e){
   // Send error to Google sheet
   // Exception: The mediaData parameter only supports blob types for uploads.

  }
}

问题

上述应用脚本代码表示blob不是支持媒体类型。

问题

如何从浏览器中创建的.ogg blob创建Google驱动器中的新.ogg文件?

1 个答案:

答案 0 :(得分:2)

这些修改怎么样?

修改要点:

javascript方:

  • blob编码为base64,并将其作为字符串数据发送。

GAS方面:

  • 将base64解码为blob,并将其另存为mimeType为audio/ogg的ogg文件。
  • 将文件另存为audio/ogg
    • 在我的环境中,它无法从audio/ogg转换为application/vnd.google-apps.audio

修改后的脚本:javascript端

来自:

axios.post("https://script.google.com/macros/s/SOME_ID/exec", blob)
  .then((response)=>{
   console.log(response)
  }).catch(error =>{
   console.log(error)
  })

致:

var reader = new FileReader();
reader.readAsDataURL(blob);
reader.onloadend = function() {
  base64 = reader.result.replace(/^.*,/, "");
  let data = new URLSearchParams();
  data.append('data', base64);
  axios.post(
    "https://script.google.com/macros/s/SOME_ID/exec",
    data,
    {headers: {'Content-Type': 'application/x-www-form-urlencoded'}}
  ).then((response)=>{
    console.log(response)
  }).catch(error =>{
    console.log(error)
  });
}

修改后的脚本:GAS端

致:

function createNewSoundFile(base64){
  var data = Utilities.base64Decode(base64.parameters.data); // Added
  var blob = Utilities.newBlob(data); // Added

  var title = 'Was created from a recording'
  var folderId = 'SOME_FOLDER_ID'
  var resource = {
    title: title,
    parents: [
      {
        "id": folderId, 
//        "kind": "drive#fileLink" // I didn't know whether this is required.
      }
    ],
    mimeType: "audio/ogg", // Modified
  };
  try{

  var newfile = Drive.Files.insert(resource, blob).id

  } catch(e){
   // Send error to Google sheet
   // Exception: The mediaData parameter only supports blob types for uploads.

  }
}

注意:

  • 在我的环境中,javascript端脚本需要{headers: {'Content-Type': 'application/x-www-form-urlencoded'}}。如果您的环境不需要,请将其删除。

如果我误解了你的问题,我很抱歉。