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方面:
- 将
编码到base64,并将其作为字符串数据发送blob
- 将base64解码为
,并将其保存为模拟类型为blob
的ogg文件audio/ogg
- 将文件另存为
。audio/ogg
- 在我的环境中,它无法从
转换为audio/ogg
application/vnd.google apps.audio
- 在我的环境中,它无法从
- 在我的环境中,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.
}
}