在electron如果直接使用a标签的download
属性离开控制下载文件的话,对于文件扩展名的处理会不那么友好。为了便于处理可以使用Electron提供的saveDialog
以及原生node的http
模块以及fs
模块来下载保存文件。
saveDialog部分示例代码:
const dialog = require('electron').dialog;
const options = {
defaultPath: '~/' + param.name,
nameFieldLabel: param.name,
filters: [
{ name: param.name, extensions: param.extensions }
]
};
dialog.showSaveDialog(options, filename => {
if (param.isActiveHotKey) {
doHotKeys();
}
if (filename) {
// 下载文件
downloadFile(param.url, filename, param.isBase64);
}
});
下载文件示例代码:
const http = require('http');
const fs = require('fs');
export default function downloadFile(url, path, isBase64 = false) {
if (!isBase64) {
// 网络资源保存
http.get(url, res => {
res.setEncoding('binary');
let fileData = '';
res.on('data', chunk => {
fileData += chunk;
});
res.on('end', () => {
fs.writeFile(path, fileData, 'binary', err => {
if (err) {
console.error(err);
}
});
});
});
} else {
// 保存base64图片
let imgData = url;
// 过滤data:URL
let base64Data = imgData.replace(/^data:image\/\w+;base64,/, '');
let dataBuffer = Buffer.from(base64Data, 'base64');
fs.writeFile(path, dataBuffer, err => {
if (err) {
console.error(err);
}
});
}
}
参考: