我正在尝试获取一些驱动器 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/