本文概述
- 要求
- 在桌面上下载文件
- 基于承诺的实施
有时, 不是你需要处理文件下载的用户, 而是你。考虑一个需要一些额外文件才能工作的应用程序, 因为每个用户都会更改这些文件。
让用户处理这些文件的下载并不明智, 因为那是Electron允许我们执行的操作, 但这不是我们想要的。
在C#, Objective-C之类的本地语言中, 有一些简单的(理论上的)代码片段, 这些代码片段显示了如何在没有用户交互的情况下在OS中下载文件。在本文中, 我们将介绍一种在节点请求库的帮助下使用Electron中的Javascript轻松下载文件而无需太多变通方法的方法。
要求
- 在这种情况下, 我们将需要节点请求库。
npm install request
在桌面上下载文件在继续之前, 请在脚本顶部声明基本依赖性。
var request = require('request');
var fs = require('fs');
文件系统将负责在请求lib下载文件时将文件写入我们的桌面。
请求被设计为进行http调用的最简单方法。它支持HTTPS, 默认情况下遵循重定向。请求库具有许多很棒的功能, 你可能需要在使用它之前对其进行探索。由于有了这个库, 我们将能够流式传输任何响应并将其保存到文件中。
神奇之处在于createWriteStream, 该函数以非常简单的方式创建可写流。使用文件路径调用fs.createWriteStream之后, 你可以使用可写流。事实证明, 响应(以及请求)对象是流。因此, 我们将GET数据流式传输到文件输出。
【如何使用Electron下载网络文件,保存并显示下载进度】我们的解决方案基于此原理, 非常易于使用和理解:
function downloadFile(file_url , targetPath){// Save variable to know progressvar received_bytes = 0;
var total_bytes = 0;
var req = request({method: 'GET', uri: file_url});
var out = fs.createWriteStream(targetPath);
req.pipe(out);
req.on('response', function ( data ) {// Change the total bytes value to get progress later.total_bytes = parseInt(data.headers['content-length' ]);
});
req.on('data', function(chunk) {// Update the received bytesreceived_bytes += chunk.length;
showProgress(received_bytes, total_bytes);
});
req.on('end', function() {alert("File succesfully downloaded");
});
}function showProgress(received, total){var percentage = (received * 100) / total;
console.log(percentage + "% | " + received + " bytes out of " + total + " bytes.");
}
注意根据文件大小(以文件字节为单位)和接收到的字节总数(在每个数据事件上添加到receive_bytes中)来检索进度。
要下载文件, 请使用downloadFile方法。此方法将资源的Web URL作为第一个参数, 将文件保存到的本地目录(包括文件名和扩展名)作为第二个参数。
downloadFile("http://www.planwallpaper.com/static/images/butterfly-wallpaper.jpeg", "/var/www/downloads/butterfly-wallpaper.jpeg");
最后, 你只需要担心提供有效的本地路径。你可以使用文件夹选择器, 然后提供文件名, 或者仅提供静态路径并仅检索原始名称。
var fileURL = "http://www.planwallpaper.com/static/images/butterfly-wallpaper.jpeg";
// butterfly-wallpaper.jpegvar filename = getFilenameFromUrl(fileURL);
var downloadsFolder = "C:\\Users\\sdkca\\Downloads";
function getFilenameFromUrl(url){return url.substring(url.lastIndexOf('/') + 1);
}var finalPath = downloadsFolder + "\\" + filename;
downloadFile(fileURL, finalPath);
基于承诺的实施如果你不喜欢使用这么多回调, 那么你可能是一个Promises的人。以下代码段实现了相同的代码来下载文件, 但带有承诺:
/** * Promise based download file method */function downloadFile(configuration){return new Promise(function(resolve, reject){// Save variable to know progressvar received_bytes = 0;
var total_bytes = 0;
var req = request({method: 'GET', uri: configuration.remoteFile});
var out = fs.createWriteStream(configuration.localFile);
req.pipe(out);
req.on('response', function ( data ) {// Change the total bytes value to get progress later.total_bytes = parseInt(data.headers['content-length' ]);
});
// Get progress if callback existsif(configuration.hasOwnProperty("onProgress")){req.on('data', function(chunk) {// Update the received bytesreceived_bytes += chunk.length;
configuration.onProgress(received_bytes, total_bytes);
});
}else{req.on('data', function(chunk) {// Update the received bytesreceived_bytes += chunk.length;
});
}req.on('end', function() {resolve();
});
});
}
而且它的用法仍然非常简单:
downloadFile({remoteFile: "http://www.planwallpaper.com/static/images/butterfly-wallpaper.jpeg", localFile: "/var/www/downloads/butterfly-wallpaper.jpeg", onProgress: function (received, total){var percentage = (received * 100) / total;
console.log(percentage + "% | " + received + " bytes out of " + total + " bytes.");
}}).then(function(){alert("File succesfully downloaded");
});
玩得开心
推荐阅读
- 如何在Electron Framework中实现类似选项卡的浏览器
- 如何在Kali Linux中安装Node.js
- 如何在Electron项目中使用实时重载
- 如何防止系统在Electron Framework中进入暂停(睡眠)模式
- 如何在Kali Linux中使用DirBuster列出网站的目录和文件
- 如何启用搜索菜单以在Electron Framework的应用程序中快速找到单词或短语
- 如何检查你的代码是否正在Electron或浏览器中执行
- 如何在Kali Linux中使用GoLismero搜索网站中的安全漏洞
- 如何在app工厂模式中管理额外的模块()