node.js - 使用 Google Drive API 和 async/await 获取文件缓冲区

标签 node.js google-drive-api

我正在尝试获取一些驱动器 pdf 文件的缓冲区,以便我可以解析它并使用数据。

我已经设法使用 async/await 和用 Promise 包装的“drive.files.list”来获取文件名和 id。现在我需要使用文件 ids 来获取缓冲区,然后读取它。

我需要的函数应该返回一个 promise ,即我可以等待(使用await)完成以获得缓冲区。 (当我从网站响应中获取 pdf 缓冲区时,我的解析器工作正常)

function getBuffer(drive, file) {
  return new Promise((resolve, reject) => {
    /////Google Auth
    var jwToken = new google.auth.JWT(
      key.client_email,
      null,
      key.private_key, ["https://www.googleapis.com/auth/drive"],
      null
    );
    jwToken.authorize((authErr) => {
      if (authErr) {
        return reject([false, "Auth Error: " + authErr]);
      }
    });
    drive.files.get({
      auth: jwToken,
      fileId: file.id,
      alt: 'media',
      supportsAllDrives: true
    }, function (err, res) {
      if (err) {
        return reject('The API returned an error: ' + err);
      };
      console.log(res);
      const buffer = res;
      resolve(buffer);
    });
  });
}

我这样使用它:

var buffer = await getBuffer(drive,files[i]);

我在“console.log(res)”中得到的输出是这样的:

... ��M�7�|��[��Ξ�A���EBS]�P�r����j�3�|�I.��i�+ϢKU���U�:[�═�,^�t덲�v��=}'*8���ѻ��#����s�No�-��q8E9�/f� �(��`j'3 "╚�-����������[jp&��╚k��M��vy�In�:a����OlN��u����6��n��q�/Y�i4�?&%��q�,��p╚.ZV&n����2G������X����Y

D],�ggb�&�N���G���NS�Lח\U�^R|_f<��f*�|��]�{�3�-P�~�CS��t��>g�Y��#�#7Wj�╗=�5�����#ɻ���5]>}&v�╝═�wg�eV�^>�#�{��Ѿ������>O�� z�?{8I j�0╗B�.�Cjm�4������║��m�,╗������O���fS��ׂcE��g�3(�G��}d^O������7����|� H�N��; {��x�b�׮�i]=����~��=��ٟ<��C�� wi��'a�-��p=M�6o��ϴ��ve��+��' ...

当我尝试使用解析器(pdf2json)时,我收到此错误:

“解析 PDF 时发生错误:流必须有数据”

提前致谢:D

最佳答案

  • 您想要从 Google 云端硬盘下载文件。
  • 您想要将下载的数据转换到缓冲区。
  • 您已经能够使用 googleapis 和 Node.js 从 Google 云端硬盘下载文件。

如果我的理解是正确的,那么这个修改怎么样?在本次修改中,文件以流类型下载,并将数据转换到缓冲区。

修改后的脚本:

从:
drive.files.get({
  auth: jwToken,
  fileId: file.id,
  alt: 'media',
  supportsAllDrives: true
}, function (err, res) {
  if (err) {
    return reject('The API returned an error: ' + err);
  };
  console.log(res);
  const buffer = res;
  resolve(buffer);
});
到:
drive.files.get(
  {
    auth: jwToken,
    fileId: file.id,
    alt: "media",
    supportsAllDrives: true
  },
  { responseType: "stream" },
  function(err, { data }) {
    if (err) {
      return reject("The API returned an error: " + err);
    }
    let buf = [];
    data.on("data", function(e) {
      buf.push(e);
    });
    data.on("end", function() {
      const buffer = Buffer.concat(buf);
      console.log(buffer);
      // fs.writeFile("filename", buffer, err => console.log(err)); // For testing
      resolve(buffer);
    });
  }
);

注意:

  • 作为测试用例,我可以确认当 buffer 时使用 fs.writeFile("filename", buffer, err => console.log(err)); 保存到文件中,即可创建下载的文件。

引用:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

关于node.js - 使用 Google Drive API 和 async/await 获取文件缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57812456/

相关文章:

node.js - 如何限制 NPM 安装

android - 在 Google Drive App 文件夹中存储房间数据库?

搜索父文件夹 google Drive api 中的所有子项目

java - Android 应用程序中的云驱动器使用

javascript - 删除最后一个反斜杠后的所有内容

node.js - 如何将 facebook 爬虫机器人重定向到另一个网页?

javascript - 使用 Express 和表单输入提交在 Node.js 上执行查询

google-drive-api - Google Drive SDK : using drive. 安装范围将网络应用程序集成到 "open with"UI 不工作

c# - 使用 C# 的 Google Drive API - 上传

javascript - NodeJS MongoDB 查询