如何向“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.js 中同时向不同频道发送消息?

如何修复重新启动机器人后无法正常工作的事件

Discord - 使用 python 显示来自特定类别的频道名称

如何从我的 json 文件中将某些内容打印到不和谐频道中? - 不和谐.py

JDA - 发送消息

Perl 和 IRC:定期向频道发送消息