API Google Диска - ulpoad аудио-блоб, преобразованный в метод base64 string- drive.files.create - Идентификатор файла не найден - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь отправить аудио-блоб в какую-то папку на диске Google.Чтобы преуспеть, я перевожу блоб в файл перед отправкой.С момента получения я получил ошибку:

Ошибка: файл не найден.код: 404, ошибки: [{domain: 'global', причина: 'notFound', сообщение: 'Файл не найден: 1aazd544z3FOCAsdOA5E7XcOaS3297sU.', locationType: 'parameter', location: 'fileId'}]}

прогрессивное редактирование: До сих пор я преобразовал свой аудио-блоб в строку base64, чтобы упростить обработку моего BLOB-объекта.

Но я не всегда могу записать файл с моим аудио-блобом base 64:

Здесь мой 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')
})

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Три шага: создайте временный файл с вашими данными base64 из функции drive.files.create, затем дайте этому файлу определенное имя -eg tempFile, также вы можете настроить это имя со временемзначение.После этого передайте этот файл методу "fs.createReadStream", чтобы загрузить его на диск Google.

Некоторые подсказки:

Во-первых - используйте path.join (__dirname, name + "-" + Date.now () + ". ext"), чтобы создать имя файла

Во-вторых - makeэтот процесс выполняется асинхронно, чтобы избежать конфликта потоков данных (при попытке создания файла до его создания), поэтому вызовите drive.files.create после установки функции fs.writeFile.

В-третьих - Уничтожить временный файл после завершения операции.Это позволяет автоматизировать процесс.

Я позволю вам погрузиться в методы, которые вам нужны.Но в основном fs должен выполнять эту работу.

Опять же, будьте осторожны с потоком данных и используйте callback для управления им.Ваш код может потерпеть крах только потому, что функция не работает.Некоторые ссылки:

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
});
}
0 голосов
/ 07 июня 2018

Как насчет этой модификации?Я не уверен, что условие blob из реагирует на приложение.Не могли бы вы попробовать использовать эту модификацию?В этой модификации используются file или blob из activApp.js.

Модифицированный скрипт:

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

Если это не сработало, извините.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...