1.之前写了axios发送http请求及上传下载功能,后面渐渐的需要很多功能,在这里整理一下我平常用到了,方便以后使用
const axios = require("axios");
const FS = require("fs");
const FilePath = require("path");
const UUID = require("uuid");
const json2csv = require("json2csv");
const json2xls = require("json2xls");
const csv2json = require("csvtojson");
const xlsx = require("node-xlsx");
const sDateTime = require("silly-datetime");
const readline = require("readline");
const MD5 = require("md5");
const crypto = require("crypto");
// 返回重定向url
async function redirectRequest(url) {
let response = await axios.get(url);
return response.request._redirectable._options.href;
}
// 获取一个uuid
function getUuid() {
return UUID.v1().replace(/-/g, '');
}
// 判断是否为数组
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
}
// json保存为csv文件
function jsonToCsv(json, savePath) {
let csv = json2csv.parse(json);
FS.writeFileSync(savePath, csv);
}
// json保存为xls文件
function jsonToXls(json, savePath) {
let jsonArray = [];
json.forEach(item => {
jsonArray.push(item);
})
let xls = json2xls(jsonArray);
FS.writeFileSync(savePath, xls, "binary");
}
// 读取csv文件成json
async function cvsToJson(filePath) {
let jsonObjs = [];
await csv2json().fromFile(filePath, "utf-8").then(jsonObj => {
jsonObjs = jsonObj;
});
return jsonObjs;
}
// 追加到文件末尾
function toFile(fileName, content) {
FS.appendFileSync(fileName, "\n" + content);
}
// 保存文件
function writeFile(fileName, content) {
FS.writeFileSync(fileName, content);
}
// 逐行获取文件到数组
async function getFile(fileName) {
let readStream = FS.createReadStream(fileName);
let objReadline = readline.createInterface({
input: readStream,
terminal: true
});
let files = [];
let i = 0;
for await (const line of objReadline) {
files[i++] = line;
}
return files;
}
// 写数据到xlsx
let data = [
{
name: sheet.name,
data: dataRow
}
];
function writeXlsx(data, savePath) {
let buffer = xlsx.build(data);
FS.writeFileSync(savePath, buffer);
}
// 获取文件夹下文件夹列表
function getDirsInDir(dir) {
return FS.readdirSync(dir);
}
// 获取文件夹下文件列表
function getFileInDir(dir) {
return FS.readdirSync(dir);
}
// 链接下载文件
async function downloadLink(link) {
let lastIndex = link.lastIndexOf("/");
if (lastIndex === 0 || lastIndex === videoLink.length - 1) {
console.log("this link is invalid, link is " + link);
return;
}
let filename = videoLink.substring(lastIndex + 1);
let fileStream = FS.createWriteStream("E:/file/" + filename);
const response = await axios.get(link, {
responseType: "stream"
});
await response.data.pipe(fileStream);
fileStream.on("finish", function () {
console.log(filename + "保存完成")
fileStream.close();
});
}
// 格式化时间
function formatDate(date, format) {
if (format == null || format === "") {
format = "YYYY-MM-DD HH:mm:ss"
}
return sDateTime.format(date, format);
}
// MD5加密
function md5(data) {
return MD5(data);
}
// 睡眠ms
async function sleep(delay) {
return new Promise(resolve => setTimeout(resolve, delay));
}
// 获取文件大小
function getFileSize(fileFullName) {
return FS.statSync(fileFullName).size;
}
// 获取文件MD5
function getFileMd5(fileFullName) {
let rs = FS.readFileSync(fileFullName);
let hash = crypto.createHash("md5");
hash.update(rs);
return hash.digest("hex");
}
// 获取大文件MD5,分片计算
async function getBigFileMd5(fileFullName) {
return new Promise((resolve, reject) => {
const stream = FS.createReadStream(fileFullName);
const hash = crypto.createHash('md5');
stream.on('data', chunk => {
hash.update(chunk);
});
stream.on('end', () => {
const md5 = hash.digest('hex');
resolve(md5)
});
});
}
// 获取文件片段
function getFileBytes(fileFullName, chunkSize, start, end) {
return FS.createReadStream(fileFullName, {
"start": start,
"end": end
}
);
}
// 文件大小转换B->其它
function fileSizeTransfer(size) {
if (size === 0) {
return "0B";
}
let k = 1024;
let sizes = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
let i = Math.floor(Math.log(size) / Math.log(k));
return (size / Math.pow(k, i)).toPrecision(3) + sizes[i];
}
// 取随机数
function genRandom(n) {
let chars = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"];
let str = "";
for (let i = 0; i < n; i++) {
let id = Math.ceil(Math.random() * 61);
str += chars[id];
}
return str;
}
// object 转 json
function obj2str(o) {
let r = [];
if (typeof o == "string") {
return "\"" + o.replace(/([\'\"\\])/g, "\\$1").replace(/(\n)/g, "\\n").replace(/(\r)/g, "\\r").replace(/(\t)/g, "\\t") + "\"";
}
if (typeof o == "undefined") {
return "undefined";
}
if (typeof o == "object") {
if (o === null) return "null";
else if (!o.sort) {
for (let i in o)
r.push("\"" + i + "\"" + ":" + obj2str(o[i]));
r = "{" + r.join() + "}"
} else {
for (let i = 0; i < o.length; i++)
r.push(obj2str(o[i]));
r = "[" + r.join() + "]"
}
return r;
}
return o.toString();
}
module.exports = {
redirectRequest,
getUuid,
jsonToCsv,
jsonToXls,
cvsToJson,
getSheets,
writeXlsx,
toFile,
writeFile,
formatDate,
getFile,
getDirsInDir,
md5,
downloadLink,
getFileInDir,
sleep,
getFileSize,
getFileMd5,
getBigFileMd5,
getFileBytes,
fileSizeTransfer,
genRandom,
obj2str
}