首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Google drive API - drive.files.create加载以base64字符串格式转换的音频blob - ulpoad方法-未找到文件id

Google drive API - drive.files.create加载以base64字符串格式转换的音频blob - ulpoad方法-未找到文件id
EN

Stack Overflow用户
提问于 2018-06-07 05:20:59
回答 2查看 829关注 0票数 0

我正试着在某个Google驱动器文件夹上发送一个音频文件。为了成功,我会在发送文件之前转换文件中的blob。自启动以来,我收到一个错误:

错误:找不到文件。代码: 404,错误:{域:‘全局’,原因:‘未找到’,消息:‘找不到文件: 1aazd544z3FOCAsdOA5E7XcOaS3297sU.',locationType:’参数‘,位置:'fileId’}}

渐进式编辑:到目前为止,我已经将我的音频斑点转换为base64字符串,以简化我的斑点的处理。

但是,我总是不能用我的base64音频blob写一个文件:

这是我的driveApi.js:

代码语言:javascript
复制
 // request data from req.body
var data = req.body.data ; // data variable is presented in form of base64 string
var name = req.body.word ;
 (...)
 // WRITE FILE AND STORE IT IN BODY HEADER PROPERTY
  body: fs.writeFile((name + ".mp3"), data.substr(data.indexOf(',')+1), {encoding: 'base64'}, function(err) {
    console.log('File created')
})
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-08 05:55:13

有三个步骤:使用drive.files.create函数中的base64数据创建一个临时文件,然后为该文件指定一个特定的名称-e.g。tempFile,您还可以使用时间值自定义此名称。之后,通过一个"fs.createReadStream“方法将该文件上传到Google drive上。

一些提示:

首先-使用path.join(__dirname,name + "-“+ Date.now() +".ext”)创建文件名

Secondly 异步执行此过程,以避免数据流冲突(尝试在创建文件之前创建文件),因此请在设置fs.writeFile函数后调用drive.files.create。

Thirdly 在操作完成后销毁tempFile。它允许您自动执行该过程。

我让你深入研究你需要的方法。但从根本上讲,fs应该可以完成这项工作。

同样,要小心数据流,并使用回调来控制它。你的代码可能会崩溃,仅仅因为函数以一种非操作的方式运行。一些链接:

https://nodejs.org/api/path.html https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback

下面是一个实例:

代码语言:javascript
复制
// datavalue = some time value 
fs.writeFile(
  path.join(__dirname, name + "-" + datevalues +".mp3" ),
  data.substr(data.indexOf(',')+1),
  {encoding: 'base64'},
  // callback
    function(err) {

        if(err){ console.log("error writting file : " + err)}
      console.log('File created')
      console.log("WRITTING") // control data flow
    fileCreate(name)
})

function fileCreate (name){
// upload file in specific folder
var folderId = "someID";
var fileMetadata = {
  'name': name + ".mp3" ,
  parents: [folderId]
}; console.log("MEDIA") // control data flow
var media = {
  mimeType: 'audio/mp3',
  body: fs.createReadStream(path.join(__dirname, name + "-" + datevalues +".mp3" ))
};
drive.files.create({
  auth: jwToken,
  resource: fileMetadata,
  media: media,
  fields: 'id'
}, function (err, file) {
  if (err) {
    // Handle error
    console.error(err);
  } else {
    console.log('File Id: ', file.data.id);
  }

  // make a callback to a deleteFile() function // I let you search for it
});
}
票数 1
EN

Stack Overflow用户

发布于 2018-06-07 10:54:13

这个修改怎么样?我不确定来自reactApp.js的blob的情况。所以你能试着使用这个修改吗?在此修改中,使用来自reactApp.js的fileblob

修改后的脚本:

代码语言:javascript
复制
var stream = require('stream'); // Added

module.exports.uploadFile = function(req){
 var file ;
  console.log("driveApi upload reached")
  function blobToFile(req){
    file = req.body.blob
    //A Blob() is almost a File() - it's just missing the two properties below which we will add
    file.lastModifiedDate = new Date();
    file.name = req.body.word;
    return file;
  }

var bufStream = new stream.PassThrough(); // Added
bufStream.end(file); // Or bufStream.end(### blob from reactApp.js ###) Added

console.log(typeof 42);
// upload file in specific folder
var folderId = "1aa1DD993FOCADXUDNJKLfzfXcOaS3297sU";
var fileMetadata = {
  "name": req.body.word,
  parents: [folderId]
}
var media = {
  mimeType: "audio/mp3",
  body: bufStream // Modified
}

drive.files.create({
  auth: jwToken,
  resource: fileMetadata,
  media: media,
  fields: "id"
}, function (err, file) {
  if (err) {
    // Handle error
    console.error(err);
  } else {
    console.log("File Id: ", file.id);
  }
  console.log("driveApi upload accomplished")
});
}

如果这不起作用,我很抱歉。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50729797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档