如何向“will-download”事件名称/频道添加额外参数,以识别触发它的原因
Posted
技术标签:
【中文标题】如何向“will-download”事件名称/频道添加额外参数,以识别触发它的原因【英文标题】:How to add an extra argument to 'will-download' event name/channel, in order to identify what triggered it 【发布时间】:2018-08-02 09:27:07 【问题描述】:我正在尝试为电子应用程序中的下载创建自定义跟踪器。我想要的功能是允许在单击下载链接的位置附近创建和维护一个跟踪器。为此,我希望能够传递对触发此下载的项目的引用。
mainWindow.webContents.session.on('will-download', (event, item, webContents) =>
item.on('updated', (event, state) =>
if (state === 'interrupted')
console.log('Download is interrupted but can be resumed');
else if (state === 'progressing')
if(item.isPaused())
console.log('Download is paused');
else
console.log(`Received bytes: $item.getReceivedBytes()`);
)
item.once('done', (event, state) =>
if(state === 'completed')
console.log('Download successful');
else
console.log(`Download Failed: $state`);
)
);
我该如何做到这一点?似乎只要对文件发出 GET 请求,就会触发“将下载”。如何在单击之前为其添加参数?这些信息是否可以从 event/webContents 中检索到?
对不起,如果这很明显,我是网络应用程序开发的完全菜鸟。
谢谢!
【问题讨论】:
您是否可以控制包含下载链接的站点? 是的。我确实可以控制包含链接的网站,但不能控制链接的目标。 【参考方案1】:一段时间后,我找到了一种更好的方法来完成我想做的事情,使用electron-download-manager。我在点击时使用了一个单独的 ipc 事件,它传递了所需的参数,并在 main 上使用了 electron-download-manager 来使用这些参数来为特定下载创建一个“监视器”通道。
希望这对某人有所帮助。仍然很想知道是否可以通过额外的参数以某种方式“重载” will-download 事件。
【讨论】:
【参考方案2】:目前我不知道如何覆盖电子内部事件,但如果您可以访问所有下载链接,那么您可以将带有自定义值的“#”附加到您的链接中。这样,您可以使它们唯一并重新识别链接。在我看来,英镑是一个好方法,因为它只在客户端而不是服务器站点上具有特殊含义。我建议如下:
<a href="http://ipv4.download.thinkbroadband.com/50MB.zip#test" data-progress="#progress-zipfile" download>download</a> <span id="progress-zipfile">0</span>
然后您可以像这样从主进程将事件发送回渲染器进程(咖啡脚本中的示例):
win.webContents.session.on 'will-download', (event, item, webContents) ->
[url, hash, rest...] = item.getURL().split /#/
file = url: url, id: hash
webContents.send 'download-started', file: file, totalBytes: item.getTotalBytes()
item.setSavePath('/tmp/download.zip')
item.on 'updated', (event, state) ->
webContents.send 'download-updated',
file: file,
receivedBytes: item.getReceivedBytes(),
totalBytes: item.getTotalBytes(),
state: state
if (state == 'interrupted')
console.log('Download is interrupted but can be resumed')
else if (state == 'progressing')
if (item.isPaused())
console.log('Download is paused')
else
console.log("Received bytes: #item.getReceivedBytes()")
item.once 'done', (event, state) ->
if (state == 'completed')
console.log('Download successfully')
else
console.log("Download failed: #state")
webContents.send 'download-completed', file: file, receivedBytes: item.getReceivedBytes(), state: state
在您的 Renderer-Process 中,您可以对这样的事件采取行动:
<script>
const ipcRenderer = require('electron');
const updateProgress = function(url, percent)
let progress = 0;
let anchor = document.querySelector('a[href="' + url + '"]');
let idProgressBar = anchor.dataset.progress;
let progressSpan = document.querySelector(idProgressBar);
progressSpan.textContent=percent.toString() + " %";
;
ipcRenderer.on('download-updated', (event, arg) =>
let file = arg.file;
if (arg.totalBytes && arg.totalBytes > 0)
progress = Math.round(arg.receivedBytes * 100.0 / arg.totalBytes);
else
progress = 0;
updateProgress(file.url + '#'+ file.id, progress);
);
ipcRenderer.on('download-completed', (event, arg) =>
let file = arg.file;
let progress = 100;
if (arg.state !== 'completed')
progress = arg.state;
updateProgress(file.url + '#'+ file.id, progress);
);
【讨论】:
以上是关于如何向“will-download”事件名称/频道添加额外参数,以识别触发它的原因的主要内容,如果未能解决你的问题,请参考以下文章
Discord - 使用 python 显示来自特定类别的频道名称