gpt4 book ai didi

node.js - 使用缓冲区或流将 Webshot 传输到 Google Drive,无需存储中间文件?

转载 作者:太空宇宙 更新时间:2023-11-03 22:12:15 24 4
gpt4 key购买 nike

tl;博士

我目前正在尝试使用 webshot 获取屏幕截图并上传到 Google 云端硬盘,无需将文件保存到文件系统作为该过程的中间步骤。

任何能让我做到这一点的代码——无论采用何种方法——都是非常受欢迎的!!

我尝试过的

我能够通过从 webshot 保存文件然后将该文件上传到 Google Drive 来让系统在本地运行,但这在我使用的服务器环境 (Elastic Beanstalk) 上是不可能的,我想避免无论如何,困惑。

Webshot 允许流式传输屏幕截图。这是他们的示例代码:

var webshot = require('webshot');
var fs = require('fs');

var renderStream = webshot('google.com');
var file = fs.createWriteStream('google.png', {encoding: 'binary'});

renderStream.on('data', function(data) {
file.write(data.toString('binary'), 'binary');
});

但是,这似乎与仅写入文件达到了相同的目的。

Google 云端硬盘,在其 google-api-nodejs-client 中(我使用的)允许将主体设置为可读流。这是他们的示例代码:

var fs = require('fs');
var drive = google.drive({ version: 'v3', auth: oauth2Client });

drive.files.create({
resource: {
name: 'testimage.png',
mimeType: 'image/png'
},
media: {
mimeType: 'image/png',
body: fs.createReadStream('awesome.png') // read streams are awesome!
}
}, callback);

在我看来,由于 fs.createWriteStreamfs.createReadStream 都允许写入缓冲区,因此我应该能够将其设置为同时写入和写入读自。然而,我已经尝试了所有可能的组合,在网络和 StackOverflow 中搜索了示例,并尝试了一些与我的特定应用程序有些接近的建议解决方案。 Webshot 讨论了作为流上传到 S3[注意:我尝试在此处发布第三个链接,但没有足够的信誉点。要找到它,您必须查看 node-webshot 存储库中的问题 #90],尽管我无法使其与 Google Drive 一起使用。我已经尝试了所有我能想到的方法,发布到 StackOverflow 是我最后的手段。这是我当前的(失败的)代码,尽管我可能偏离了基础:

let buffers = [];
let renderStream = webshot('google.com');
renderStream.on('data', chunk=> buffers.push(chunk));
renderStream.on('end', ()=> {
drive.files.create({
auth: oauth2Client,
resource: {
name: 'testimage.png',
mimeType: 'image/png',
parents: [ folderID ],
},
media: {
mimeType: 'image/png',
body: fs.createReadStream(Buffer.concat(buffers))
}
}, (error, response, body)=> {
if (error || !response || !response.name) {
console.log(error, response);
}
});
});

[注意:这是代码的简化。 drive.files.create() 部分实际上包含在其自己的函数中,当传递实际的 PNG 文件(在 media.body 中使用)时,该函数 100% 有效fs.createReadStream(Buffer.concat(buffers))),甚至是从 webshot 下载的]

我对流/缓冲区世界相当陌生,这可能是显而易见的。然而,我对这个问题束手无策,将寻求任何我能得到的帮助!!

预先感谢您的任何建议。

最佳答案

讽刺的是,我距离终点线只有几英寸。事实上,当我在发布这个问题后关闭我的选项卡时,我注意到测试文件已经显示在 Google Drive 中!我的最后一个实现已经成功:我刚刚看到一个错误并假设它没有。 (该错误是由于我在那里保留了一个 fs.unlink 过程来删除中间文件......我现在已经完全避免了!)

这是最终结果(请注意,我在这里组合了两个不同的模块,以便您可以一目了然地看到所有内容):

'use strict';

const gdrive = require('googleapis').drive('v3');
const googleAuth = require('google-auth-library');
const webshot = require('webshot');

const creds = require('path/to/client_secret.json').installed;
const auth = new googleAuth();

let drive = {};
let submission = {};

drive.oauth2Client = new auth.OAuth2(creds.client_id, creds.client_secret, creds.redirect_uris[0]);
drive.oauth2Client.credentials = require('path/to/drive.json');

drive.uploadStream = (stream, filename, folderID, callback)=> {
gdrive.files.create({
auth: drive.oauth2Client,
resource: {
name: filename,
mimeType: 'image/png',
parents: [ folderID ],
},
media: {
mimeType: 'image/png',
body: stream,
}
}, callback);
};

submission.submit = (obj, callback)=> {
let buffers = [];
let renderStream = webshot(obj.uri);
renderStream.on('data', chunk=> buffers.push(chunk));
renderStream.on('end', ()=> {
drive.uploadStream(Buffer.concat(buffers), `${obj.filename}.png`, obj.folderID, callback);
});
};

/*
Example:

submission.submit({ uri: 'https://duckduckgo.com', filename: 'ddg', folderID: 'G0bBl3deg00K' }, (err, response, body)=> {
console.log(err || response);
});
*/

关于node.js - 使用缓冲区或流将 Webshot 传输到 Google Drive,无需存储中间文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38901838/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com