Express使用connect-multiparty时文件被本地存储,如何直接获取请求体
Node.js Express 直接获取上传文件内容方案
你当前使用的connect-multiparty中间件设计逻辑默认将上传文件写入本地临时目录,无内置内存缓存模式,无法满足直接获取请求体内容的需求,可通过以下两种方案实现:
方案1:使用multer中间件内存存储模式(推荐)
multer是目前Express生态最常用的文件解析中间件,支持配置内存存储,所有上传文件会以Buffer形式挂载到请求对象上,不会写入本地磁盘。
操作步骤
- 安装依赖
npm install multer @azure/storage-blob
- 代码示例
const express = require('express'); const multer = require('multer'); const { BlobServiceClient } = require('@azure/storage-blob'); const app = express(); // 配置multer使用内存存储,不写入本地 const storage = multer.memoryStorage(); const upload = multer({ storage: storage }); // Azure Blob 初始化(替换为你自己的连接串和容器名) const blobServiceClient = BlobServiceClient.fromConnectionString('你的Azure存储连接串'); const containerClient = blobServiceClient.getContainerClient('你的容器名'); // 单文件上传接口 app.post('/upload', upload.single('file'), async (req, res) => { try { // 直接从req.file获取内存中的文件Buffer,不需要读本地文件 const fileBuffer = req.file.buffer; const fileName = req.file.originalname; const blockBlobClient = containerClient.getBlockBlobClient(fileName); // 直接上传内存Buffer到Azure Blob await blockBlobClient.uploadData(fileBuffer, { blobHTTPHeaders: { blobContentType: req.file.mimetype } }); res.status(200).json({ message: '上传成功', url: blockBlobClient.url }); } catch (err) { res.status(500).json({ error: err.message }); } }); app.listen(3000, () => console.log('服务启动在3000端口'));
如果需要支持多文件上传,可将upload.single('file')替换为upload.array('files', 10),最大上传数量可自定义,文件内容会挂载到req.files数组中
方案2:手动处理原始请求流
如果不希望引入额外中间件,可以直接监听Express请求的流事件拼接Buffer,适合非multipart/form-data格式的上传场景:
app.post('/upload/raw', async (req, res) => { const chunks = []; // 监听数据流事件,拼接二进制内容 req.on('data', (chunk) => chunks.push(chunk)); req.on('end', async () => { try { const fileBuffer = Buffer.concat(chunks); // 此处直接处理fileBuffer上传到Azure Blob即可 const blockBlobClient = containerClient.getBlockBlobClient('自定义文件名'); await blockBlobClient.uploadData(fileBuffer); res.status(200).json({ message: '上传成功' }); } catch (err) { res.status(500).json({ error: err.message }); } }); });
注意:该方案如果用于multipart/form-data格式的请求,你需要自行解析请求头中的boundary拆分表单字段和文件内容,开发成本较高,非特殊场景不推荐
内容的提问来源于stack exchange,提问作者user11823877
相关产品推荐
相关产品推荐

