如何使用 App Script 通过 Docs Add On 将文件添加到 Google 驱动器?
How to Add a file to Google Drive via Docs Add On using App Script?
这是我的场景。我为 Google Docs 创建了一个附加组件,充当视频工具箱。
我要添加的一项功能是能够使用内置网络摄像头(使用 videojs-recorder)录制视频,然后 link 到文档中的该视频。我的视频部分可以正常工作,但不确定如何将 webm JS Blob 转换为 Google Blob,以便我可以在用户 Google 驱动器上创建文件以供共享和 linking.
只是想弄清楚这是如何工作的,这是我到目前为止所做的,但没有任何运气。
客户端代码
//event handler for video recording finish
vidrecorder.on('finishRecord', function()
{
// the blob object contains the recorded data that
// can be downloaded by the user, stored on server etc.
console.log('finished recording: ', vidrecorder.recordedData);
google.script.run.withSuccessHandler(function(){
console.log("winning");
}).saveBlob(vidrecorder.recordedData);
});
服务器端代码
function saveBlob(blob) {
Logger.log("Uploaded %s of type %s and size %s.",
blob.name,
blob.size,
blob.type);
}
我得到的错误似乎与 blob 的序列化有关。但实际上异常并不是很有用 - 只是指向一些最小化的代码。
编辑:请注意,这里没有涉及 FORM 对象,因此没有表单 POST,也没有 FileUpload 对象,正如其他人指出的那样 ,但是它略有不同,因为我们是得到一个Blob对象,需要保存到服务器。
感谢 Zig Mandel 和 Steve Webster,他们从 G+ discussion 中提供了一些关于此的见解。
我终于拼凑了足够的部分来实现它。
客户代码
vidrecorder.on('finishRecord', function()
{
// the blob object contains the recorded data that
// can be downloaded by the user, stored on server etc.
console.log('finished recording: ', vidrecorder.recordedData.video);
var blob = vidrecorder.recordedData.video;
var reader = new window.FileReader();
reader.readAsDataURL(blob);
reader.onloadend = function() {
b64Blob = reader.result;
google.script.run.withSuccessHandler(function(state){
console.log("winning: ", state);
}).saveB64Blob(b64Blob);
};
});
服务器代码
function saveB64Blob(b64Blob) {
var success = { success: false, url: null};
Logger.log("Got blob: %s", b64Blob);
try {
var blob = dataURItoBlob(b64Blob);
Logger.log("GBlob: %s", blob);
var file = DriveApp.createFile(blob);
file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.COMMENT);
success = { success: true, url: file.getUrl() };
} catch (error) {
Logger.log("Error: %s", error);
}
return success;
}
function dataURItoBlob(dataURI) {
// convert base64/URLEncoded data component to raw binary data held in a string
var byteString;
if (dataURI.split(',')[0].indexOf('base64') >= 0)
byteString = Utilities.base64Decode(dataURI.split(',')[1]);
else
byteString = decodeURI(dataURI.split(',')[1]);
// separate out the mime component
var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
return Utilities.newBlob(byteString, mimeString, "video.webm");
}
这是我的场景。我为 Google Docs 创建了一个附加组件,充当视频工具箱。
我要添加的一项功能是能够使用内置网络摄像头(使用 videojs-recorder)录制视频,然后 link 到文档中的该视频。我的视频部分可以正常工作,但不确定如何将 webm JS Blob 转换为 Google Blob,以便我可以在用户 Google 驱动器上创建文件以供共享和 linking.
只是想弄清楚这是如何工作的,这是我到目前为止所做的,但没有任何运气。
客户端代码
//event handler for video recording finish
vidrecorder.on('finishRecord', function()
{
// the blob object contains the recorded data that
// can be downloaded by the user, stored on server etc.
console.log('finished recording: ', vidrecorder.recordedData);
google.script.run.withSuccessHandler(function(){
console.log("winning");
}).saveBlob(vidrecorder.recordedData);
});
服务器端代码
function saveBlob(blob) {
Logger.log("Uploaded %s of type %s and size %s.",
blob.name,
blob.size,
blob.type);
}
我得到的错误似乎与 blob 的序列化有关。但实际上异常并不是很有用 - 只是指向一些最小化的代码。
编辑:请注意,这里没有涉及 FORM 对象,因此没有表单 POST,也没有 FileUpload 对象,正如其他人指出的那样
感谢 Zig Mandel 和 Steve Webster,他们从 G+ discussion 中提供了一些关于此的见解。
我终于拼凑了足够的部分来实现它。
客户代码
vidrecorder.on('finishRecord', function()
{
// the blob object contains the recorded data that
// can be downloaded by the user, stored on server etc.
console.log('finished recording: ', vidrecorder.recordedData.video);
var blob = vidrecorder.recordedData.video;
var reader = new window.FileReader();
reader.readAsDataURL(blob);
reader.onloadend = function() {
b64Blob = reader.result;
google.script.run.withSuccessHandler(function(state){
console.log("winning: ", state);
}).saveB64Blob(b64Blob);
};
});
服务器代码
function saveB64Blob(b64Blob) {
var success = { success: false, url: null};
Logger.log("Got blob: %s", b64Blob);
try {
var blob = dataURItoBlob(b64Blob);
Logger.log("GBlob: %s", blob);
var file = DriveApp.createFile(blob);
file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.COMMENT);
success = { success: true, url: file.getUrl() };
} catch (error) {
Logger.log("Error: %s", error);
}
return success;
}
function dataURItoBlob(dataURI) {
// convert base64/URLEncoded data component to raw binary data held in a string
var byteString;
if (dataURI.split(',')[0].indexOf('base64') >= 0)
byteString = Utilities.base64Decode(dataURI.split(',')[1]);
else
byteString = decodeURI(dataURI.split(',')[1]);
// separate out the mime component
var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
return Utilities.newBlob(byteString, mimeString, "video.webm");
}