使用node.js从Google云端硬盘读取二进制文件

Dra*_*sil 6 javascript binary google-drive-api

我在使用API​​从Drive获取二进制文件时遇到了问题,我一直在圈子里.

以下是相关的代码位:

// Load client secrets from a local file.
fs.readFile('client_secret.json', function processClientSecrets(err, content) {
  if (err) {
    console.log('Error loading client secret file: ' + err);
    return;
  }
  // Authorize a client with the loaded credentials, then call the
  // Drive API.
  oauth.authorize(JSON.parse(content), dasm.init, driveapi.getFile)
});
Run Code Online (Sandbox Code Playgroud)

driveapi.getFile:

function getFile(auth, cb) {
  var service = google.drive('v3');
  service.files.get({
    auth: auth,
    pageSize: 20,
    fileId: "0B2h-dgPh8_5CZE9WZVM4a3BxV00",
    alt: 'media'
  }, function(err, response) {
    if (err) {
      console.log('The API returned an error: ' + err);
      return;
    }
    cb(response)
  });
}
Run Code Online (Sandbox Code Playgroud)

现在,response看起来像是一个字符串.当我尝试转换为十六进制时,它会疯狂.有没有什么方法可以response把它变成一个Buffer?或者它从我得到它的第二个被破坏了service.files.get

坚果,我的意思是

console.log(
        arrData[0].charCodeAt(0).toString(2),
        '-',
        arrData[1].charCodeAt(0).toString(2),
        '-',
        arrData[2].charCodeAt(0).toString(2),
        '-',
        arrData[3].charCodeAt(0).toString(2),
        '-',
        arrData[4].charCodeAt(0).toString(2)
    )
Run Code Online (Sandbox Code Playgroud)

= 1001101 - 1011010 - 1111111111111101 - 0 - 11(我正在使用二进制文件来尝试查看损坏的内容)

正确的十六进制是4D 5A 90 00 03

编辑:对于那些谁是困惑,像我,怎么90成了fffd它的Unicode替换字符,当值不映射到的ASCII字符是被显示.

Dra*_*sil 5

终于可以解决这个问题了。Google API 使用请求模块,您可以应用它接受的任何选项。作为参考,您需要设置[encoding: null]2,因为任何其他选项都会通过 toString 传递响应,因此如果您正在处理二进制数据,则会破坏它。

工作代码位于下面:

function getFile(auth, cb) {
  var service = google.drive({
    version: 'v3', 
    encoding: null
  });
  service.files.get({
    auth: auth,
    fileId: "0B2h-dgPh8_5CZE9WZVM4a3BxV00",
    alt: 'media'
  }, function(err, response) {
    if (err) {
      console.log('The API returned an error: ' + err);
      return;
    }
    cb(response)
  });
}
Run Code Online (Sandbox Code Playgroud)