我正在尝试使用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;
}
);
}
所以问题是:
所有帮助深表感谢! 谢谢
答案 0 :(得分: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()
。在这种模式下,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);
}
);
supportsAllDrives: true
和/或supportsTeamDrives: true
。如果我误解了您的问题,而这不是您想要的方向,我深表歉意。