javascript - 将 .ogg blob 转换为 Google Drive 文件

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

背景

我想录制学生的演讲,然后将他们的录音自动上传到 Google 云端硬盘。

现状

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

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

我可以在 doPost() 请求中将 blob 发送到 Google Apps 脚本独立脚本。在本例中,我使用带有 promise 的 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 Apps 脚本

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,并保存为ogg文件,mimeType为audio/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'}} 。如果您的环境不需要它,请将其删除。

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

关于javascript - 将 .ogg blob 转换为 Google Drive 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48255683/

相关文章:

JavaScript 多边形碰撞检测

javascript查找第n次出现并在其前面添加下划线

xml - 使用ImportXML和XPath从XML提取数据

google-apps-script - 从父级导航嵌入式 Google Apps 脚本 iFrame

google-apps-script - 使用 Apps 脚本将图像上传到 Google 电子表格

javascript - 创建基本的 Google 脚本来复制 SS 并保存到我的驱动器上的特定文件夹

google-apps-script - 如何强制文件夹中的所有文件都归 Google Drive 中的文件夹所有者所有?

javascript - 列出当前用户可以使用 Google Drive API 编辑的文件

javascript - Jquery 检测文本框编程更改

javascript - 屏幕左侧的白色垂直线