依赖
- 案例使用的是 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} />