Nodejs+Express+fomidable实现文件上传

94 阅读1分钟
var express = require("express");
var router = express.Router();
const { IncomingForm } = require("formidable");
const fs = require("fs");

router.post("/", function (req, res, next) {
  // 文件上传操作的配置项
  let options = {
    // 是否支持多文本上传
    multiples: true,
    // 是否保留文件的后缀名
    keepExtensions: true,
    // 指定上传文件的的存放位置
    uploadDir: "public/images",
    // 是否允许上传空文件
    allowEmptyFiles: false,
  };
  // 创建一个IncomingForm对象
  const form = new IncomingForm(options);
  // 保存文本域数据对象
  let fields = {};
  // 保存文件域数据数组
  let files = [];
  // 监听文本域的数据请求
  form.on("field", function (name, value) {
    fields[name] = value;
  });
  // 监听文件域的数据请求
  form.on("file", function (formName, file) {
    files.push({ imgUrl: file.path, fileName: file.name });
  });
  // 监听数据传递结束事件
  form.on("end", function () {
    let pics = [];
    // 遍历数组,修改文件名
    files.forEach((item) => {
      let oldpath = item.imgUrl;
      let prefix = oldpath.substring(0, oldpath.lastIndexOf("\\") + 1);
      let fileName = Date.now() + item.fileName;
      let newpath = prefix + fileName;
      // 修改文件名称
      fs.renameSync(oldpath, newpath);
      let object = {};
      object.imgUrl = "http://127.0.0.1:3000/images/" + fileName;
      pics.push(object);
    });
    // 封装文本域对象
    fields.pics = pics;
    // 返回数据
    res.send(fields);
  });
  form.parse(req);
});
module.exports = router;