Electron Browser - 临时下载文件?

问题描述 投票:0回答:1

我正在编写一些 cypress 测试,下载 zip 文件并将其解压缩。 Cypress 默认使用 Electron 浏览器,我见过一些失败情况,解压缩实用程序显示 zip 文件具有“无 END 标头”(但当我在测试后查看文件时,一切看起来都很好)。

我怀疑 Electron 浏览器在下载时会以最终名称保存下载文件,但当该文件名首次出现时,下载可能尚未完成。

Chrome 有一项功能,可以将“仍在进行中”的下载文件保存为 .crdownload,并且仅在下载完成后才将其重命名为最终名称。

我查找了 Electron 的文档,试图找出它应该如何表现,但没有任何运气。 谁能告诉我 Electron 是否/应该在下载文件时执行此“临时文件名”操作?

electron
1个回答
0
投票

尝试使用session的will-download事件来拦截这些进度并在你自己的电子APP中实现类似的功能。

const downloadFolder = path.join(app.getPath('downloads'));

  session.defaultSession.on('will-download', (event, item, webContents) => {
    const fileName = item.getFilename();
    const tempFilePath = path.join(downloadFolder, `${fileName}.download`);
    const completeFilePath = path.join(downloadFolder, fileName);

    // Set the save path (including a temporary extension)
    item.setSavePath(tempFilePath);

    item.on('updated', (event, state) => {
      if (state === 'interrupted') {
        console.log('Download was interrupted');
      } else if (state === 'progressing') {
        if (item.isPaused()) {
          console.log('Download is paused');
        } else {
          console.log(`Received bytes: ${item.getReceivedBytes()}`);
        }
      }
    });

    item.on('done', (event, state) => {
      if (state === 'completed') {
        console.log('Download successfully completed');
        fs.rename(tempFilePath, completeFilePath, (err) => {
          if (err) throw err;
          console.log(`File renamed to ${completeFilePath}`);
        });
      } else {
        console.log(`Download failed: ${state}`);
        fs.unlink(tempFilePath, (err) => {
          if (err) console.error(`Failed to delete temporary file: ${err.message}`);
        });
      }
    });
  });
});
© www.soinside.com 2019 - 2024. All rights reserved.