V tomto článku sa opäť venujem Electronu, tento krát sťahovaniu súboru a príčine, prečo sťahovanie vždy skončí s výsledkom cancelled.
Pri práci s Electronom a tvorením kódu pre sťahovanie súborom som sa stretol s problémom, ktorý som nevedel veľmi dlho vyriešiť a ním bol stav sťahovania – cancelled. Žiaľ nikde som nenašiel článok o tom, prečo mi tento stav vzniká.
Problém prečo som chybu neodhalil veľmi rýchlo bol ten, že som sa zameriaval na proces sťahovania a hľadania problému, ktorý môže uvedený stav vytvárať. Až po dlhšom čase som si všimol, že som mal použitý príkaz, ktorý celé sťahovanie blokoval.
session.defaultSession.on('will-download', (event, item, webContents) => {
event.preventDefault();
let filename = item.getFilename();
let size = item.getTotalBytes();
if (size == 0) {
console.error("Incorrect file size");
return;
}
let pathToFile = app.getAppPath('userData') + "/downloads/" + filename;
item.setSavePath(pathToFile);
item.on('updated', (event, state) => {
let received = item.getReceivedBytes();
console.log("size: " + size);
if (state === 'interrupted') {
console.log('Download is interrupted but can be resumed')
} else if (state === 'progressing') {
let progress = Math.round((received / size) * 100);
let script = `window.progress.value = ${progress}`;
mainWindow.webContents.executeJavaScript(script).catch(() => { });
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}`)
}
});
});
Zdrojom problému bol veľmi populárny príkaz, vďaka ktorému sa ruší východiskové správanie a preberá kontrola nad celým procesom.
event.preventDefault();
Záver
Odstránením uvedeného príkazu už download funguje bez problémov aj so všetkými stavmi a detegovaním progresu v percentách.