You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动