Skip to content

文件上传

示例代码

app.js

js
// app.js

const core = require('cors');
const express = require('express');
const bodyParser = require('body-parser');
const uploadRouter = require('./routes/upload');

const app = express();
app.use(core())
app.use(bodyParser.json());

// 支持访问上传到服务器上的文件
app.use(express.static('static'));

// 挂载子路由模块
app.use('/upload', uploadRouter);

app.listen(3000, () => {
  console.log(`服务已启动 http://localhost:3000`);
});

routes/upload.js

js
// routes/upload.js

const multer = require('multer');
const express = require('express');
const fs = require('fs');
const path = require('path');
const { fileUpload } = require('../utils/fileUpload');

const router = express.Router();

// 单文件上传
router.post('/', fileUpload('myFile'), (req, res) => {
  const file = req.file;
  if (!file) {
    return res.send({code: 500, msg: '没有上传的文件'});
  }
  res.send({code: 200, msg: '上传成功', data: {fileUrl: `http://${req.headers.host}/static/uploads/${file.filename}`}});
});

module.exports = router;

utils/fileUpload.js

js
// utils/fileUpload.js

const express = require('express');
const multer = require('multer');
const fs = require('fs');
const path = require('path');

const fileUpload = (fieldName, prefix = 'uploads') => {
  const storage = multer.diskStorage({
    destination: function (req, file, cb) {
      try {
        fs.mkdirSync(path.join(process.cwd(), `static/${prefix}`), { recursive: true });
      } catch (e) {};
      cb(null, path.join(process.cwd(), `static/${prefix}`));
    },
    filename: function (req, file, cb) {
      const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1e9) + '-' + file.originalname;
      cb(null, file.fieldname + '-' + uniqueSuffix);
    },
  });
  
  const upload = multer({ storage });
  
  return (req, res, next) => {
    upload.single(fieldName)(req, res, (err) => {
      if (err) {
        next(err);
        return;
      }
      next();
    });
  };
};

module.exports = {
  fileUpload
};