一、需求

根据后端需要对识别接口进行比对识别率,于是后端发了一堆ase64的json文件,由于手动复制base64图片直接到postman会卡死。为了提升效率,于是想到用node批量读取文件调用接口。

21.png

二、实现

使用node+axios 做到批量处理文件

1、准备工作

新建一个项目文件夹,执行以下命令, 会自动在该文件下生成 node_module 文件夹;分别执行npm install fs

npm install axios

npm install babel-cli

npm install babel-preset-es2015

2、创建一个run.js文件

首先读取文件内容

var fs = require('fs');
var axios = require('axios');
const xlsx = require("node-xlsx");
fs.readFile('行驶证图片1658451609586.json', 'utf8', function (err, data) {
    if (err) {
        console.log(err);
    }
    postData(data);
});
function postData(datas) {
    axios({
        method: 'post',
        url: 'http://192.168.1.117:9090/vehicleType/distinguishResult',
        data: {
            noodles: 1,
            name: 1,
            img:datas
        },
        headers:{
            'Content-Type': 'application/json',
            'Authorization': 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiIsImV4cCI6MTY1ODc1NTY3MX0.NHY_5QZ-XRClBbLtKJD3EJxwcpRzlUK2kpHxfRsrq-d5b47JSTm4BQtZACfGICXHzOo55jQfsNf0l3imIl9suw'
        }})
        .then(res => { 
               
            console.log(res.data);

        })
        .catch(error => {        
            console.log(error);
        });
}

这样就实现了读取文件,发送请求的操作。但是这样只能读取一个文件。于是改成如下代码

var fs = require('fs');
var axios = require('axios');
const xlsx = require("node-xlsx");
// fs.readFile('行驶证图片1658451609586.json', 'utf8', function (err, data) {
//     if (err) {
//         console.log(err);
//     }
//     postData(data);
// });
var path = require('path');//解析需要遍历的文件夹
var filePath = path.resolve('./test1');
//调用文件遍历方法
fileDisplay(filePath);

function fileDisplay(filePath){
    //根据文件路径读取文件,返回文件列表
    fs.readdir(filePath,function(err,files){
        if(err){
            console.warn(err)
        }else{
            //遍历读取到的文件列表
            files.forEach(function(filename){
                //获取当前文件的绝对路径
                var filedir = path.join(filePath, filename);
                //根据文件路径获取文件信息,返回一个fs.Stats对象
                fs.stat(filedir,function(eror, stats){
                    if(eror){
                        console.warn('获取文件stats失败');
                    }else{
                        var isFile = stats.isFile();//是文件
                        var isDir = stats.isDirectory();//是文件夹
                        if(isFile){
                            // console.log(filedir);                 // 读取文件内容
                            var content = fs.readFileSync(filedir, 'utf-8');
                            // console.log(content);
                            postData(content,filename)
                        }
                        if(isDir){
                            fileDisplay(filedir);//递归,如果是文件夹,就继续遍历该文件夹下面的文件
                        }
                    }
                })
            });
        }
    });
}
function postData(datas,filedir) {
    axios({
        method: 'post',
        url: 'http://192.168.1.117:9090/vehicleType/distinguishResult',
        data: {
            noodles: 1,
            name: 1,
            img:datas
        },
        headers:{
            'Content-Type': 'application/json',
            'Authorization': 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiIsImV4cCI6MTY1ODc1NTY3MX0.NHY_5QZ-XRClBbLtKJD3EJxwcpRzlUK2kpHxfRsrq-d5b47JSTm4BQtZACfGICXHzOo55jQfsNf0l3imIl9suw'
        }})
        .then(res => { 
               
            console.log(res.data);

        })
        .catch(error => {        
            console.log(error);
        });
}

在加上导出表格的操作。完美!

const list = [
    {
      name: "sheet",
      data: [],
    },
  ];
function writeXlsx(datas,filedir) {
    let listContent = []
    for (const [key, value] of Object.entries(datas.data)) {
        listContent.push(value)
       
      }
      listContent.unshift(filedir);

  list.forEach(item=>{
    item.data.push(listContent)
  })
    const buffer = xlsx.build(list);
    fs.writeFile("testFile.xlsx", buffer, function (err) {
      if (err) {
        console.log(err, "保存excel出错");
      } else {
        console.log("写入excel成功!!!");
      }
    });
}

导出表格如下

21.png

最终的目录为:

21.png

最终代码为:

var fs = require('fs');
var axios = require('axios');
const xlsx = require("node-xlsx");
// fs.readFile('行驶证图片1658451609586.json', 'utf8', function (err, data) {
//     if (err) {
//         console.log(err);
//     }
//     postData(data);
// });
var path = require('path');//解析需要遍历的文件夹
var filePath = path.resolve('./test1');
//调用文件遍历方法
fileDisplay(filePath);

function fileDisplay(filePath){
    //根据文件路径读取文件,返回文件列表
    fs.readdir(filePath,function(err,files){
        if(err){
            console.warn(err)
        }else{
            //遍历读取到的文件列表
            files.forEach(function(filename){
                //获取当前文件的绝对路径
                var filedir = path.join(filePath, filename);
                //根据文件路径获取文件信息,返回一个fs.Stats对象
                fs.stat(filedir,function(eror, stats){
                    if(eror){
                        console.warn('获取文件stats失败');
                    }else{
                        var isFile = stats.isFile();//是文件
                        var isDir = stats.isDirectory();//是文件夹
                        if(isFile){
                            // console.log(filedir);                 // 读取文件内容
                            var content = fs.readFileSync(filedir, 'utf-8');
                            // console.log(content);
                            postData(content,filename)
                        }
                        if(isDir){
                            fileDisplay(filedir);//递归,如果是文件夹,就继续遍历该文件夹下面的文件
                        }
                    }
                })
            });
        }
    });
}
function postData(datas,filedir) {
    axios({
        method: 'post',
        url: 'http://192.168.1.117:9090/vehicleType/distinguishResult',
        data: {
            noodles: 1,
            name: 1,
            img:datas
        },
        headers:{
            'Content-Type': 'application/json',
            'Authorization': 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiIsImV4cCI6MTY1ODc1NTY3MX0.NHY_5QZ-XRClBbLtKJD3EJxwcpRzlUK2kpHxfRsrq-d5b47JSTm4BQtZACfGICXHzOo55jQfsNf0l3imIl9suw'
        }})
        .then(res => { 
               
            // console.log('文件名字'+filedir,res.data);
            writeXlsx(res.data,filedir)

        })
        .catch(error => {        
            console.log(error);
        });
}

const list = [
    {
      name: "sheet",
      data: [],
    },
  ];
function writeXlsx(datas,filedir) {
    let listContent = []
    for (const [key, value] of Object.entries(datas.data)) {
        listContent.push(value)
       
      }
      listContent.unshift(filedir);

  list.forEach(item=>{
    item.data.push(listContent)
  })
    const buffer = xlsx.build(list);
    fs.writeFile("testFile.xlsx", buffer, function (err) {
      if (err) {
        console.log(err, "保存excel出错");
      } else {
        console.log("写入excel成功!!!");
      }
    });
}