node.js - 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
解决方案
推荐阅读
- bash - 如何忽略/还原文件内容中大小写的变化?
- c# - System.Data.Entity.QueryableExtensions.Include :对象引用未设置为实例
- angular - 替换或更改 Angular 8/9 中现有或旧的组件前缀?
- reactjs - 如何制作可以使用 React.js 捕获图像然后将其上传到 firebase 的相机?
- javascript - 为什么我在使用基于我的代码的反应时收到此错误?
- vue.js - 在 Vue 的选项卡中迭代对象
- reactjs - PrimeReact 下拉菜单有问题
- python - 通过使用matplotlib对pandas(python)中的csv数据的趋势有什么改进?
- stm32 - PGSERR 和 PGPERR 位清零
- sql - 如何解决 SQL Server 中的数据类型不兼容问题