我正在编写一些 cypress 测试,下载 zip 文件并将其解压缩。 Cypress 默认使用 Electron 浏览器,我见过一些失败情况,解压缩实用程序显示 zip 文件具有“无 END 标头”(但当我在测试后查看文件时,一切看起来都很好)。
我怀疑 Electron 浏览器在下载时会以最终名称保存下载文件,但当该文件名首次出现时,下载可能尚未完成。
Chrome 有一项功能,可以将“仍在进行中”的下载文件保存为 .crdownload,并且仅在下载完成后才将其重命名为最终名称。
我查找了 Electron 的文档,试图找出它应该如何表现,但没有任何运气。 谁能告诉我 Electron 是否/应该在下载文件时执行此“临时文件名”操作?
尝试使用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}`);
});
}
});
});
});