Node.js Express如何将上传的PNG图片保存至文件系统?
嘿,这事儿其实不难!你已经拿到了文件的缓冲区数据,只需要用Node.js内置的fs模块把它写入到文件系统就行,我给你捋清楚步骤,再给你完整的代码示例:
核心思路
上传的文件存在req.files里,它的data属性是文件的二进制缓冲区,我们要做的就是把这个缓冲区写入到指定路径的文件中。另外要注意先确保保存文件的目录存在,不然会报错。
完整修改后的代码
var express = require('express'); const fileUpload = require('express-fileupload'); const fs = require('fs'); const path = require('path'); // 用path处理路径更稳妥,避免跨平台问题 var router = express.Router(); // 提前创建uploads目录(如果不存在的话),recursive: true会自动创建多级目录 fs.mkdirSync(path.join(__dirname, 'uploads'), { recursive: true }); router.post("/upload", fileUpload(), (req, res) => { // 先判断是否有文件被上传 if (!req.files || Object.keys(req.files).length === 0) { return res.status(400).send('没有上传任何文件'); } // 假设前端上传的字段名是`file`,如果你的字段名不一样,记得改成对应的键 const uploadedImage = req.files.file; // 构造文件保存的完整路径 const savePath = path.join(__dirname, 'uploads', uploadedImage.name); // 把缓冲区数据写入文件(异步方式,不会阻塞服务器) fs.writeFile(savePath, uploadedImage.data, (err) => { if (err) { console.error('保存文件出错:', err); return res.status(500).send(`保存文件失败:${err.message}`); } console.log(`文件 ${uploadedImage.name} 已保存到 ${savePath}`); res.send(`文件 ${uploadedImage.name} 上传并保存成功!`); }); }); module.exports = router;
几个实用补充
- 避免文件名重复覆盖:如果用户上传同名文件,会覆盖之前的,你可以给文件名加个时间戳或者随机字符串:
// 给文件名加时间戳 const fileName = `${Date.now()}-${uploadedImage.name}`; const savePath = path.join(__dirname, 'uploads', fileName); - 权限问题:确保Node.js进程有写入
uploads目录的权限,不然会出现权限错误。 - 同步vs异步:上面用的是异步的
fs.writeFile,如果想用同步写法可以用fs.writeFileSync,但同步操作会阻塞服务器事件循环,高并发场景不推荐使用。
内容的提问来源于stack exchange,提问作者Cap Barracudas




