首页 > 解决方案 > multer:带有音频和图像文件的请求发布的意外字段

问题描述

我的第一次尝试是上传一个音频文件,它成功了,我在文档上使用 mp3.single('mp3File'),然后我尝试添加另一个文件,它是一个图像文件,所以我尝试 multer fields,我不知道我是否做对了,所以请指导我,

还有一件事,我正在尝试将文件另存为 file.originalname,但它不能那样工作

这是我的serve.js

require("dotenv").config();
const express = require("express");
const mongoose = require("mongoose");

const app = express();
const port = 3334 || 5000;

app.use(express.json());
app.use(express.static("public"));

const url = process.env.MONGO_URL;
mongoose.connect(url, { useCreateIndex: true, useNewUrlParser: true });
const db = mongoose.connection;
db.on("error", error => console.log(error));
db.once("open", () => console.log("Connected to database"));

const songRouter = require("./routes/song");
app.use("/song", songRouter);

// 400 Error setup
app.use((req, res, next) => {
  const error = new Error("Not Found");
  error.status(400);
  next(error);
});
// ============================================= //
// 500 Error setup
app.use((error, req, res, next) => {
  res.status(error.status || 500);
  res.json({
    error: {
      message: error.message
    }
  });
});

app.listen(port, () => {
  console.log(`Server is running on port: ${port}`);
});

楷模

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const songSchema = new Schema({
  song: { // name of song
    type: String,
    required: true
  },
  singer: { // names of singer
    type: [String]
    // type: Schema.Types.ObjectId,
    // ref: "Singer"
  },
  featureSinger: {
    type: [String]
    // type: Schema.Types.ObjectId,
    // ref: "Singer"
  },
  releaseDate: { // date of the song released
    type: Date
  },
  mp3File: { // audio file
    type: String,
    required: true,
    ref: "/public/mp3"
  },
  coverImage: { // image file
    type: String,
    required: true,
    ref: "/public/cover"
  }
});

const Song = mongoose.model("Song", songSchema);

module.exports = Song;

路线

const router = require("express").Router();
const multer = require("multer");
let Song = require("../models/song.models");

// mp3 file
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, "./public/mp3/");
  },
  fileName: (req, file, cb) => {
    cb(null, new Date().toISOString() + file.originalname);
    // doesnt format as its originalname
  }
});
const fileFilter = (req, file, cb) => {
  if (file.mimetype === "audio/mpeg") {
    cb(null, true);
  } else {
    cb(new Error("You can only upload mp3 file"), false);
  }
};
const mp3 = multer({
  storage: storage,
  limits: {
    fileSize: 1024 * 1024 * 10
  },
  fileFilter: fileFilter
});

// image file
const store = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, "./public/cover/");
  },
  fileName: (req, file, cb) => {
    cb(null, file.originalname);
    // doesnt format as its originalname
  }
});
const imageFilter = (req, file, cb) => {
  if (file.mimetype === "jpeg/png") {
    cb(null, true);
  } else {
    cb(new Error("You can only upload image file"), false);
  }
};
const imageFile = multer({
  storage: store,
  fileFilter: imageFilter
});

const music = mp3.fields([{ name: "mp3File", maxCount: 1 }]);
const cover = imageFile.fields([{ name: "coverImage", maxCount: 1 }]);

router.post("/addGroupSinger", music, cover, async (req, res) => {
  console.log(req.file);

  const data = req.body;
  const file = req.file;
  const newSong = new Song({
    song: data.song,
    singer: data.singer,
    featureSinger: data.featureSinger,
    releaseDate: Date.parse(data.releaseDate),
    mp3File: file.path,
    coverImage: file.path
  });
  try {
    let songAdded = await newSong.save();
    res.status(201).json(songAdded);
  } catch (err) {
    res.status(400).json({ message: err.message });
    console.log(err);
  }
});

module.exports = router;

我希望将这两个文件保存在一个请求中,但结果是我得到了意想不到的字段,谢谢各位:D

标签: node.jsexpressmulter

解决方案


推荐阅读