【问题标题】:Convert a .ogg blob into a google drive file将 .ogg blob 转换为 google 驱动器文件
【发布时间】:2018-01-15 00:50:50
【问题描述】:

背景

我想录制学生的演讲,然后将他们的录音自动上传到 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 文件?

【问题讨论】:

  • 创建文件时是否必须使用application/vnd.google-apps.audio 而不是audio/ogg 作为mimeType?
  • 文本错误信息是什么?
  • 我添加了错误。不幸的是,这是一个谷歌翻译。例外:mediaData 매개변수는 업로드에 Blob 유형만 지원합니다。
  • @Tanaike 我使用哪种 mime 类型似乎并不重要 - 仍然有同样的错误。
  • 感谢您的回复。我发布了一个答案。 blob 转换为 base64 并发送到 WebApps。请将此视为几个答案之一。

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


【解决方案1】:

这些修改怎么样?

修改点:

javascript 方面:

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

气体方面:

  • 将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'}}。如果您的环境不需要它,请将其删除。

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

【讨论】:

  • 你完全搞定了。几个月来,我们一直在努力让这项工作发挥作用。您的代码为我开辟了一条全新的途径。非常感谢。
  • @Jason Allshorn 欢迎。我很高兴你的问题得到了解决。我也可以从你的问题中学习。也谢谢你。
猜你喜欢
  • 1970-01-01
  • 2015-02-17
  • 2013-07-06
  • 2017-02-22
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
相关资源
最近更新 更多