- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
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.createWriteStream
和 fs.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/
我想使用 webshot 将来自特定站点的一些 Web 元素导出到 png 文件R图书馆。 首先,安装和加载库: install.packages("webshot",dependencies = T
在服务器上,我想截取外部链接的屏幕截图并将其保存到服务器的文件夹中。 我正在尝试使用 meteor 包 webshot: https://github.com/TimHeckel/meteor-web
我正在使用 node-webshot 和 phantomjs-cli 将 html 字符串呈现为 png 图像。html 包含图像标签。当 src 属性指向本地文件且未引发错误时,不会呈现图像。但是,
我正在使用 bookdown以 PDF 和 HTML 格式创建“书”。 在我有 HTML 视频的地方,我在渲染时收到此消息: Error: Functions that produce HTML ou
首先,webshot 在此上下文中不起作用 webshot("google.com") 对于 webshot("www.google.com") 我得到: env: node\r: N
我在我的 Node (sails js) 项目上使用 webshot 将 HTML 字符串转换为图像,然后将该图像上传到 S3 存储桶。当我在本地计算机上运行它时,它工作正常,即它生成一个图像,并且我
我有一个 Web 应用程序,用带有 Express 框架的 Node.js 编写,前端使用 Twitter Boostrap 3,我正在使用此模块 node-webshot为了以 png 格式保存页面
我正在尝试向使用 node-webshot 生成的 PDF 添加标题, 但没有任何显示。 我正在使用这段代码: webshot('https://www.google.com', 'google.pd
Node webshot 用于对外部网站进行图片拍摄。 node webshot API 是: var webshot = require('webshot'); var fs = requ
tl;博士 我目前正在尝试使用 webshot 获取屏幕截图并上传到 Google 云端硬盘,无需将文件保存到文件系统作为该过程的中间步骤。 任何能让我做到这一点的代码——无论采用何种方法——都是非常
模拟 node Webshot 发送的请求的正确方法是什么?在使用nock.js进行测试期间? 我尝试使用以下代码来捕获 http://example.com/foo.html 的模拟响应作为 foo
我正在使用 webshot 来保存 wordcloud2 创建的 html 小部件,但是每当我将 png 文件传递给 figPath 时,我都会得到一个空白图像。如果我打开 .html 文件,我可
我正在使用此代码生成 pdf: let fileUri = process.env.PWD + '/storage/orders-pdf/' + fileName; // Commence Websh
我是一名优秀的程序员,十分优秀!