Webshot到谷歌驱动器,而不使用缓冲区或stream存储中间文件?

TL;博士

我目前正尝试使用网页截图获取屏幕截图,并将其上传到Google云端硬盘, 而不 会将 文件保存到文件系统作为此过程中的中间步骤。

任何代码 – 无论采用哪种方式 – 都可以让我做到这一点,是最受欢迎的!

我试过了

我能够通过从webshot保存文件然后将该file upload到Google Drive来本地运行系统,但是在我使用的服务器环境(Elastic Beanstalk)上这是不可能的,我想避免这种混乱。

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

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 Drive,在他们的google-api-nodejs-client (我使用)允许将主体设置为可读stream。 这里是他们的示例代码:

 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允许写入一个Buffer,我应该可以设置一个写入和读取。 但是,我已经尝试了所有可能的组合,例如在Web和StackOverflow中search,并尝试了一些build议的解决scheme,这些解决scheme甚至与我的具体应用程序有些相似。 Webshot讨论作为stream上传到S3 [注意:我尝试在这里张贴第三个链接,但没有足够的声望点。 要find它,你将不得不在# node-webshot回购node-webshot问题#90 ,尽pipe我无法使用它来使用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中用于代替fs.createReadStream(Buffer.concat(buffers)) )时,100% ,甚至从webshot下载的一个]

我对stream/缓冲区世界相当陌生,可能是显而易见的。 然而,我在这个问题上的智慧结束,将采取任何帮助,我可以得到!

提前感谢您的任何build议。

讽刺的是,我离终点线很远。 事实上,当我发布这个问题后,我正在closures我的标签,我注意到testing文件已经显示在谷歌驱动器! 我最后的实现工作:我只是看到一个错误,并认为它没有。 (这个错误是由于我在那里保留了一个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); }); */