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

Javascript 将.ogg blob转换为google驱动器文件,javascript,google-apps-script,google-drive-api,blob,Javascript,Google Apps Script,Google Drive Api,Blob,背景 我想录制学生的讲话,然后将他们的录音自动上传到谷歌硬盘 当前事态 我有客户端代码,可以生成包含.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/exe

背景

我想录制学生的讲话,然后将他们的录音自动上传到谷歌硬盘

当前事态

我有客户端代码,可以生成包含
.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到达独立脚本

独立的谷歌应用程序脚本

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
文件?

这些修改如何

修改点: javascript方面:
  • blob
    编码到base64,并将其作为字符串数据发送
气体侧:
  • 将base64解码为
    blob
    ,并将其保存为模拟类型为
    audio/ogg
    的ogg文件
  • 将文件另存为
    audio/ogg
    • 在我的环境中,它无法从
      audio/ogg
      转换为
      application/vnd.google apps.audio
修改脚本:javascript端 发件人: 致: 修改脚本:气体侧 致: 注:
  • 在我的环境中,javascript端的脚本需要
    {headers:{'Content-Type':'application/x-www-form-urlencoded'}
    。如果您的环境中不需要它,请将其删除

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

在创建文件时,你必须使用
应用程序/vnd.google apps.audio
而不是
音频/ogg
作为模拟类型吗?文本错误消息是什么?我添加了错误。不幸的是,这是谷歌翻译的。例外:mediaData매개변수는 업로드에 斑点유형만 지원합니다.@塔奈克:我使用哪种mime类型似乎并不重要——仍然有相同的错误。谢谢你的回复。我贴出了答案
blob
转换为base64并发送到WebApps。请把这当作几个答案之一,你完全搞定了。我们几个月来一直在努力使这项工作正常进行。你的密码为我开辟了一条全新的道路。“非常感谢你!”杰森·奥尔肖恩欢迎你。我很高兴你的问题解决了。我也可以从你的问题中学习。也谢谢你。
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)
  });
}
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.

  }
}