javascript - Google Drive API - 上传音频 blob 以 base64 字符串进行转换 -drive.files.create 方法 - 找不到文件 ID

标签 javascript node.js reactjs file blob

我正在尝试在某些 Google 云端硬盘文件夹中发送音频 blob。为了成功,我在发送文件之前翻译文件中的 blob。 我从一开始就收到错误:

Error: File not found. code: 404, errors: [ { domain: 'global', reason: 'notFound', message: 'File not found: 1aazd544z3FOCAsdOA5E7XcOaS3297sU.', locationType: 'parameter', location: 'fileId' } ] }

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

但是,我总是无法用我的 Base 64 音频 blob 编写文件:

这是我的driveApi.js:

 // 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')
})

最佳答案

三个步骤:使用drive.files.create函数中的base64数据创建一个临时文件,然后为该文件指定一个特定名称 - 例如tempFile,您也可以使用时间值自定义此名称。之后,将此文件传递给“fs.createReadStream”方法以将其上传到 Google 云端硬盘。

一些提示:

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

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

第三 - 操作完成后销毁 tempFile。它允许您自动化该过程。

我让您深入了解您需要的方法。但基本上 fs 应该可以完成这项工作。

再次强调,要注意数据流并使用回调来控制它。您的代码可能会因为函数以非操作方式启动而崩溃。 一些链接:

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

这里是一个实例:

// 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
});
}

关于javascript - Google Drive API - 上传音频 blob 以 base64 字符串进行转换 -drive.files.create 方法 - 找不到文件 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50729797/

相关文章:

javascript - 有没有办法在 react 最终形式中禁用嵌套字段名称功能?

Javascript(innerHtml)搞乱了 HTML 选择标签

javascript - Jade 中的日期选择器

node.js - Proxyquire 调用原始文件而不是 stub

javascript - React.js - React Router 内容没有改变

javascript - 使用 prototype.clone() 的 Javascript 对象的内联 clone() 函数

javascript - 将负载添加到原始 JavaScript 事件

javascript - 什么使 JavaScript 函数异步?

javascript - 是否有办法在 redux reducer 中柯里化(Currying)多个 ramda 的 assocPath 方法?

reactjs - Formik 表单未在编辑时更新字段