【发布时间】:2020-09-06 19:46:25
【问题描述】:
我正在尝试使用 multer 将两个图像文件上传到一个名为 cast 的数据库中。我将图像作为表单的输入。我意识到有时它会从所有输入字段中获取文件,但有时它只接受一个图像文件作为输入。 有人可以帮我吗?提前谢谢你
adminUpload.ejs
<html>
<body>
<form class="uploadForm" method="post" action="/admin/postFile" enctype="multipart/form-data">
<label>Enter the name of the actor</label><br>
<input type="text" name="actor"><br>
<label class="control-label">Upload the image of the actor</label><br>
<input name="uplactor" type="file" class="file"><br>
<label>Enter the name of the actress</label><br>
<input type="text" name="actress"><br>
<label class="control-label">Upload the image of the actress</label><br>
<input name="uplactress" type="file" class="file"><br>
<input type="submit" value="submit" />
</form>
</body>
</html>
AdminRouter.js
const express = require('express')
const router = express.Router()
const controller=require('../Controller/Admin');
const multerFileUpload=require("../Models/Admin")
router.get('/postFile',(req,res)=>{
res.render('adminUpload.ejs');
})
var tempupload=multerFileUpload.upload.fields([
{name: 'uplactor',maxCount: 1},
{name: 'uplactress',maxCount: 1}])
router.post("/postFile",tempupload,controller.uploadDB)
module.exports=router;
Admin.js
const multer = require('multer');
const storage= multer.diskStorage({
destination: (req, file, cb) => {
if (file.fieldname === 'uplactor'||file.fieldname === 'uplactress'||file.fieldname === 'director'||file.fieldname === 'uplSideCharacter') {
// if uploading cast photo
cb(null, 'public/cast_images')
}
else if(file.fieldname === 'uplTrailer'){
// else uploading trailer
cb(null, 'public/trailers')
}
else if(file.fieldname === 'uplMovie'){
// else uploading movie
cb(null, 'public/movies')
}
else if(file.fieldname === 'uplposter'){
// else uploading poster
cb(null, 'public/posters')
}
cb(null, 'public/posters');
},
filename: (req, file, cb) => {
cb(null, file.originalname)
}
});
const fileFilter = (req, file, cb) => {
if(file.fieldname === 'uplactor'||file.fieldname === 'uplactress'||file.fieldname === 'director'||file.fieldname === 'uplSideCharacter'||file.fieldname === 'uplposter'){
if (!file.originalname.match(/\.(jpg|jpeg|png|gif)$/)) {
return cb(new Error('You can upload only image files!'));
}
else{
cb(null, true);
}
}
if(file.fieldname === 'uplMovie'||file.fieldname === 'uplTrailer'){
if (!file.originalname.match(/\.(mp4|mp3)$/)) {
return cb(new Error('You can upload only video files!'));
}
else{
cb(null, true);
}
}
};
exports.upload = multer({ storage:storage, fileFilter: fileFilter });
Admin.js(控制器文件)
const Cast = require('../Models/Cast');
exports.uploadDB=async (req,res)=>{
try{
console.log(req.files)
console.log(req.files.uplactor[0])
console.log(req.files.uplactress[0])
const actor=new Cast({
name:req.body.actor,
image:req.files.uplactor[0].filename
})
const actress=new Cast({
name:req.body.actress,
image:req.files.uplactress[0].filename
})
await actor.save();
await actress.save();
res.statusCode = 200;
res.setHeader('Content-Type', 'application/json');
res.send("hello");
}catch(err){
res.send(err);
}
}
app.js
'use strict';
const express = require('express');
const http = require('http');
const morgan = require('morgan');
const bodyParser = require('body-parser');
const AdminRouter = require('./Routes/AdminRoutes');
const mongoose = require('mongoose');
const app=express()
const server = http.createServer(app);
server.listen(3000, 'localhost', () => {
console.log('server running');
});
app.use(morgan('dev'));
app.use(express.static(__dirname + '/public'));
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.set('views', 'views');
app.set('view engine', 'ejs');
app.use('/admin',AdminRouter);
//connection to mongodb
const url = 'mongodb://localhost:27017/Movie';
const connect = mongoose.connect(url, {useNewUrlParser : true, useUnifiedTopology: true } );
connect.then(() => {
console.log("Connected correctly to server");
}, (err) => { console.log(err); });
Cast.js
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const CastSchema = new Schema({
name: {
type: String,
required: true,
unique: true
},
image: {
type: String,
required: true
}
})
const Cast = mongoose.model('Cast', CastSchema)
module.exports= Cast
【问题讨论】:
-
I realized that some times it takes files from all the input fields but sometimes it accepts only one image file as input表示是否有任何错误或 req.files 不包含正确的文件或什么? -
@DimplePatel 感谢您的回复。这意味着当我在 Admin.js(控制器文件)中的 console.log(req.files) 有时它会显示两个文件,因为我在 adminUpload.ejs 中将两个文件作为输入,但有时它只显示一个文件
-
你检查过浏览器检查器发送的http请求,看看这两个文件是否真的发送了吗?
-
顺便说一下,您应该将图像存储为
Buffer格式而不是String。
标签: mongodb express mongoose multer multiple-file-upload