nodejs上传excel&读取excel&定时删除excel

依赖

  • 案例使用的是 express 框架;
  • 依赖包选择 node-xlsx 和 multer;
  • node-xlsx 读取excel文件,multer 上传excel文件;
npm install node-xlsx multer -S

node服务端

let express = require('express');
let multer = require('multer');
var xlsx = require('node-xlsx');
let fs = require('fs');
let router = express.Router();

let Storage = multer.diskStorage({
  destination: (req, file, callback) => {
    callback(null, './public/upload'); // 指定目录 /upload
  },
  filename: (req, file, callback) => {
    callback(null, file.fieldname + '_' + Date.now() + '_' + file.originalname); // 指定文件名称
  }
});

const fileFilter = (req, file, cb) => {
  // 限制文件类型 
  var acceptableMime = ['image/jpeg', 'image/png', 'image/jpg', 'image/gif'];
  if (acceptableMime.indexOf(file.mimetype) !== -1) {
	cb(null, true);
  } else {
	cb(null, false);
  }
}

// 支持多文件上传,上传名为file, 限制数量交给前端
let upload = multer({ 
  storage: Storage,
  // fileFilter, // 过滤文件
  limits: {
	fileSize: 5 * 1000, // 1000 = 1KB, 1000*1024 = 1MB; 限制文件大小
	files: 5 // 限制上传数量,取最小限制值
  }
 }).array('file', 99999); // 限制上传数量,取最小限制值

router.post('/excel', function (req, res) {
  upload(req, res, (err) => {
    if (err) {
      res.json({
        code: '500',
        msg: '上传失败'
      });
    } else {
      console.log(req.files);
      const fileUrl = req.files[0].path; // 单个文件 路径地址
      var sheets = xlsx.parse(fileUrl);
      // console.log(sheets[0].data); // 第一张表的数据
      var arr = []; // 全部表数据
      sheets.forEach((sheet) => {
        var newSheetsArr = []; // 一张表数据
        //sheet是一个json对象,格式为{name:"测试参数",data:[]},我们想要的数据就存储在data里
        for (var i = 1; i < sheet['data'].length; i++) {
          //excel文件里的表格一般有标题所以不一定从0开始
          var row = sheet['data'][i]; // 获取行数据
          if (row && row.length > 0) {
            // newSheetsArr.push 多表数据隔离用这个
            arr.push({
              id: row[0], // row[0]对应表格里A这列
              name: row[1], // row[1]对应表格里B这列
              old: row[2], // row[2]对应表格里C这列
              sexy: row[3],
              hobby: row[4]
            });
          }
        }
        // arr.push(newSheetsArr);
      });

      const day = 60 * 60 * 24 * 1000 * 15; // 15天
      // 删除指定文件
      setTimeout(() => {
        fs.unlinkSync(fileUrl);
      }, 5000);
      // 删除文件夹下的文件
      setTimeout(() => {
        deleteFolder('public/upload/');
      }, day);

      res.json({
        code: 200,
        msg: 'success',
        data: arr,
        total: arr.length
      });
    }
  });
});

module.exports = router;

客户端

const uploadFile = (e) => {
  e = e || window.event;
  const files = e.target.files;
  if (!files.length) return message.error('文件上传失败');
  if (files.length > 3) return message.error('文件上传数量不得大于3个');
  const file = new FormData();
  for (let i = 0; i < files.length; i++) {
    // formData中的append方法 如果已有相同的键,则会追加成为一个数组
    file.append('file', files[i]); //
  }

  // formData.getAll()获取新增的表单数据
  console.log(file.getAll('file'));

  axios({
    url: '/api/excel',
    method: 'post',
    data: file
  });
}
<input type="file" onChange={uploadFile} />
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值