从Drive API v3下载图像会不断产生损坏的图像。我应该如何解读诺言的回应?

时间:2019-11-25 06:59:27

标签: node.js google-drive-api

我正在尝试使用API​​ v3从Google共享云端硬盘下载图片。下载本身将成功,但无法看到该图像。从MacOS查找器打开图像只会导致旋转器。 我开始使用文档(此处为https://developers.google.com/drive/api/v3/manage-downloads)中的示例:

const drive = google.drive({version: 'v3', auth});

// ....

var fileId = '0BwwA4oUTeiV1UVNwOHItT0xfa2M';
var dest = fs.createWriteStream('/tmp/photo.jpg');
drive.files.get({
  fileId: fileId,
  alt: 'media'
})
    .on('end', function () {
      console.log('Done');
    })
    .on('error', function (err) {
      console.log('Error during download', err);
    })
    .pipe(dest);  

但是失败了,因为.on()方法不存在。确切的错误是“ TypeError:drive.files.get(...)。on不是函数”

.get()方法返回一个Promise。 promise的响应包含的数据取决于配置是流,blob还是arraybuffer。对于所有选项,当我将响应数据写入文件时,文件本身将变得不可见并且大小错误。下面是arraybuffer示例的实际代码(typescript,node.js)。对于Blob(具有添加的名称和ModifyDate)和用于流的相似代码,它们给出的结果相同。

        const downloader = googleDrive.files.get({
            fileId: file.id,
            alt: 'media',
        }, {
            responseType: 'arraybuffer',
        });

        return downloader
            .then((response) => {

                const targetFile = file.id + '.' + file.extension;

                fs.writeFileSync(targetFile, response.data);

                return response.status;
            })
            .catch((response) => {
                    logger.error('Error in Google Drive service download: ' + response.message);
                    return response.message;
                }
            );
    }

所以问题是:

  • 通过Google Drive API v3处理下载的正确方法是什么?
  • 我需要处理响应数据的任何格式吗?

所有帮助深表感谢! 谢谢

1 个答案:

答案 0 :(得分:1)

  • 您要使用带有Node.js的googleapis从Google云端硬盘下载文件。
  • 您已经可以使用Drive API。

如果我的理解正确,那么这个答案如何?

模式1:

在这种模式下,arraybuffer用于responseType

示例脚本:

const drive = google.drive({ version: "v3", auth });
var fileId = '###';  // Please set the file ID.
drive.files.get(
  {
    fileId: fileId,
    alt: "media"
  },
  { responseType: "arraybuffer" },
  function(err, { data }) {
    fs.writeFile("sample.jpg", Buffer.from(data), err => {
      if (err) console.log(err);
    });
  }
);
  • 在这种情况下,使用Buffer.from()

模式2:

在这种模式下,stream用于responseType

示例脚本:

const drive = google.drive({ version: "v3", auth });
var fileId = '###';  // Please set the file ID.
var dest = fs.createWriteStream("sample.jpg");
drive.files.get(
  {
    fileId: fileId,
    alt: "media"
  },
  { responseType: "stream" },
  function(err, { data }) {
    data
      .on("end", () => {
        console.log("Done");
      })
      .on("error", err => {
        console.log("Error during download", err);
      })
      .pipe(dest);
  }
);

注意:

  • 如果发生错误,请使用最新版本的googleapis。
  • 从您的问题来看,您似乎已经能够使用请求检索要下载的文件,而无法打开文件内容。但是,如果发生错误,请尝试在请求中添加supportsAllDrives: true和/或supportsTeamDrives: true

参考:

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