2022-04-04 06:53:51
使用Node.js流处理大文件上传与下载的核心是通过分块传输数据,避免一次性加载整个文件到内存,从而防止内存溢出。以下是具体实现方法及关键代码示例:
一、大文件上传处理核心思路:前端上传时,后端利用multer中间件分块暂存文件,再通过流式管道(pipe)将数据从临时文件写入目标位置,最后清理临时文件。
安装依赖
npm install express multer实现代码
const express = require('express');const multer = require('multer');const fs = require('fs');const path = require('path');const app = express();const upload = multer({ dest: 'uploads/' }); // 临时存储目录app.post('/upload', upload.single('file'), (req, res) => { if (!req.file) { return res.status(400).send('未上传文件'); } const tempFilePath = req.file.path; const targetDir = './final'; if (!fs.existsSync(targetDir)) { fs.mkdirSync(targetDir, { recursive: true }); } const targetPath = path.join(targetDir, req.file.originalname); const readStream = fs.createReadStream(tempFilePath); const writeStream = fs.createWriteStream(targetPath); // 管道传输 + 错误处理 readStream.pipe(writeStream); writeStream.on('finish', () => { fs.unlinkSync(tempFilePath); // 删除临时文件 res.send('文件上传成功'); }); writeStream.on('error', (err) => { fs.unlinkSync(tempFilePath); // 出错时清理临时文件 console.error('写入失败:', err); res.status(500).send('上传失败'); });});app.listen(3000, () => console.log('服务启动'));关键点:
核心思路:通过fs.createReadStream创建可读流,设置响应头后直接管道(pipe)到HTTP响应对象,实现分批传输。
关键点:
错误处理
上传/下载时监听流的error事件,记录日志并返回友好错误信息。
示例:readStream.on('error', (err) => { console.error('流错误:', err); res.status(500).send('服务异常');});
资源释放
客户端提前断开连接时(如取消下载),调用stream.destroy()终止流。
示例:res.on('close', () => { readStream.destroy();});
临时文件清理
上传完成后无论成功与否,均删除multer生成的临时文件。
示例:writeStream.on('error', () => { fs.unlinkSync(tempFilePath); // 出错时清理});
通过以上方法,可高效、稳定地实现Node.js大文件上传与下载功能。