Node.js实现Excel上传、MySQL插入及文件下载问题求助
Excel上传、数据入库与下载功能实现指导
嗨,恭喜你已经搞定了文件上传的问题!接下来咱们一步步解决Excel数据入库和文件下载的功能,新手也能轻松跟上:
一、处理Excel数据插入MySQL
1. 安装Excel解析依赖
首先在你的Node项目里安装xlsx库,这是Node生态里处理Excel最常用的工具之一:
npm install xlsx
2. 解析上传的Excel文件
在你的getDetails函数顶部先引入xlsx:
const XLSX = require('xlsx');
然后在文件上传成功的回调里,加入读取和解析Excel的逻辑:
sampleFile.mv(__dirname+'/Myuploads/Details/'+uploadFileName, function(err) { if (err) { res.status(500).send(err); } else { // 读取上传的Excel文件 const workbook = XLSX.readFile(__dirname+'/Myuploads/Details/'+uploadFileName); // 获取Excel里的第一个工作表(如果有多个表,可根据SheetNames调整) const worksheet = workbook.Sheets[workbook.SheetNames[0]]; // 把工作表转成JSON格式,header:1表示用第一行作为字段名 const excelData = XLSX.utils.sheet_to_json(worksheet, { header: 1 }); // 接下来写插入数据库的逻辑 } });
3. 安全批量插入数据库(避免SQL注入)
你原来的SQL字符串拼接方式有严重的SQL注入风险,一定要改用参数化查询。如果Excel里有多行数据,我们可以做批量插入:
// 跳过Excel表头(如果你的第一行是字段名的话) const dataToInsert = excelData.slice(1).map(row => { // 这里根据你的Excel列对应数据库字段调整,比如row[0]是Excel第一列的值 return [row[0], row[1], row[2]]; // 示例:对应数据库的三个字段 }); // 批量插入的SQL语句,用?作为占位符 const insertQuery = "INSERT INTO details (column1, column2, column3) VALUES ?"; connection.query(insertQuery, [dataToInsert], function(err, result) { if (!err){ const response = [ {'result' : 'success'}, {'msg': `成功插入${result.affectedRows}条数据`} ]; res.setHeader('Content-Type', 'application/json'); res.status(200).send(JSON.stringify(response)); } else { res.status(400).send(err); } });
注意:把
column1, column2, column3换成你实际的数据库字段名,row[0], row[1]对应Excel里的列位置,根据你的表格结构调整。
二、实现上传文件的下载功能
1. 后端添加下载接口
在你的Node服务里新增一个接口,用来根据文件名返回服务器上的文件:
function downloadFile(req, res) { const fileName = req.query.fileName; const filePath = __dirname+'/Myuploads/Details/'+fileName; // 设置响应头,告诉浏览器这是下载文件 res.setHeader('Content-Disposition', `attachment; filename="${fileName}"`); res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); // 读取文件并返回给前端 res.sendFile(filePath, (err) => { if (err) { res.status(404).send('文件不存在'); } }); }
记得在路由里注册这个接口,比如:
app.get('/downloadFile', downloadFile);
2. 前端添加下载触发逻辑
在你的Angular控制器里,添加下载按钮的点击事件:
$scope.downloadExcel = function(fileName) { // 构造下载链接,跳转到后端接口 window.location.href = Data.baseNodeService + "downloadFile?fileName=" + encodeURIComponent(fileName); };
然后在页面上添加对应的按钮:
<button ng-click="downloadExcel(uploadedFileName)">下载上传的Excel</button>
这里的
uploadedFileName需要是你上传成功后保存的文件名,比如可以在上传成功的回调里把它存在$scope中。
三、额外注意事项
- 文件路径安全:要对下载接口的文件名做校验,确保用户只能访问指定目录下的文件,防止目录遍历攻击。
- 格式兼容:
xlsx库支持大部分Excel格式(.xlsx、.xls等),但如果有特殊格式(比如带宏的.xlsm)可能需要额外处理。 - 错误处理:在解析Excel和插入数据库的过程中,添加更多错误捕获逻辑,比如Excel为空、数据格式不符合要求等,返回更友好的错误提示。
内容的提问来源于stack exchange,提问作者TB.M
相关产品推荐
相关产品推荐

