Electron文件下载处理

在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);
            }
        });
    }
}

参考:

Electron saveDialog 文档