概览
需要把图片转换为 Base64 编码,基于 Node.js 设计了这样一个脚本,它可以处理单文件,也可以递归处理多级目录。
我们希望可以在控制台输入命令实现图片的转码,并最终保存转码好的文件到一个同名文件中。
依赖包
包名 | 备注 | 必须 |
---|---|---|
chalk | 控制台彩色输出 | 否 |
commander | 控制台命令操作 | 是 |
mime-types | 获取文件的 mimeType | 是 |
mkdirp | 递归创建目录及其子目录 | 否 |
最终实现
#!/usr/bin/env node
/**
* 图片转 base64
* @example $ node img2base64.js [file|dir]
*/
const fs = require('fs');
const path = require('path');
const mimeType = require('mime-types');
const program = require('commander'); // 命令行工具
const chalk = require('chalk'); // 带色彩的控制台输出
const mkdirp = require('mkdirp');
// 实例化 program
program.version('0.0.1')
.parse(process.argv); // 格式化参数
// 读取图片文件转换为 base64 编码,并打印到控制台
function parse(file) {
let filePath = path.resolve(file); // 原始文件地址
let fileName = filePath.split('\\').slice(-1)[0].split('.'); // 提取文件名
let fileMimeType = mimeType.lookup(filePath); // 获取文件的 memeType
// 如果不是图片文件,则退出
if (!fileMimeType.toString().includes('image')) {
console.log(chalk.red(`Failed! ${filePath}:\tNot image file!`));
return;
}
// 读取文件数据
let data = fs.readFileSync(filePath);
data = new Buffer(data).toString('base64');
// 转换为 data:image/jpeg;base64,***** 格式的字符串
let base64 = 'data:' + fileMimeType + ';base64,' + data;
// 创建输出目录
let outPath = path.resolve('./base64/');
let outFileName = `${fileName.join('-')}.txt`;
let outFile = path.join(outPath, outFileName);
if (fs.existsSync(outPath)) {
saveData(base64, outFile, filePath, outFileName);
} else {
mkdirp(outPath, () => {
saveData(base64, outFile, filePath, outFileName);
});
}
}
// 写入到文件
function saveData(data, file, filePath, outFileName) {
fs.createWriteStream(file)
.end(data, () => {
console.log(chalk.green(`Success! ${filePath}:\t${outFileName}`));
});
}
// 遍历目录下的文件并逐个转换为 base64
function dirEach(dir) {
let pa = fs.readdirSync(dir);
pa.forEach((item, index) => {
let itemPath = path.resolve(dir + '/' + item);
let stat = fs.statSync(itemPath);
if (stat.isDirectory()) {
dirEach(itemPath); // 递归
} else {
parse(itemPath); // 转换为 base64
}
});
}
// 获取输入的文件地址或目录地址
let input = program.args[0];
const MSG_ERROR_INPUT_EMPTY = 'File or filePath cann not be empty!';
const MSG_WARN_OPTION_EMPTY = 'No option';
if (!input) return console.error(new Error(MSG_ERROR_INPUT_EMPTY));
// 读取文件
fs.stat(input, (err, stats) => {
// 如果是文件则直接解析
if (stats.isFile()) return parse(input);
// 如果是目录则遍历目录下的图片文件并逐个进行解析
if (stats.isDirectory()) return dirEach(input);
// 无对应操作
console.log(MSG_WARN_OPTION_EMPTY);
});
执行效果:
命令执行效果
生成的文本文件
网友评论