我的上传器有问题。我认为所有代码都是正确的,但仍然没有在uploads文件夹中创建文件。此外,当我尝试console.log(req.files)时,我得到一个空数组。我尝试在本地制作它 这是代码:
const express = require("express"),
app = express(),
multer = require("multer"),
bodyParser=require("body-parser"),
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
var storage = multer.diskStorage({
destination: function (req, file, callback) {
callback(null, './uploads/');
},
filename: function (req, file, callback) {
callback(null, file.fieldname + '-' + Date.now() + '.' + mime.extension(file.mimetype));
}
});
var upload = multer({ storage : storage }).array('userPic');
app.post("/postFormAct", isLoggedIn, function(req, res){
upload(req,res,function(err) {
console.log(req.files);
});
});
还有我的表格:
<form method="post" action="/postFormAct" enctype="multipart/form-data">
<input type="text" name="user"><br>
<input type="text" name="email"><br>
<input type="file" name="userPic"><br>
<input type="submit" value="Submit">
</form>
答案 0 :(得分:3)
我认为您的功能级中间件存在问题,您有isLoggedIn
,您必须立即将multer中间件upload
链接起来:
// ...
var upload = multer({ storage : storage }).array('userPic');
app.post("/postFormAct", isLoggedIn, upload, function(req, res){
console.log(req.files)
});
这是一个完整的工作例子:
const app = require('express')()
const bodyParser = require('body-parser')
const multer = require('multer')
const morgan = require('morgan')
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, 'uploads')
},
filename: (req, file, cb) => {
cb(null, file.fieldname + '-' + Date.now())
}
})
const upload = multer({
storage: storage
})
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.use(morgan('dev'))
isLoggedIn = (req, res, next) => {
console.log('check if user is logged in')
next()
}
app.post('/uploads', isLoggedIn, upload.array('images'), (req, res) => {
console.log(req.files);
return res.send(req.files);
})
app.listen(8000, () => {
console.log(`server is listenning on port 8000`)
})
您可以找到测试存储库here
还要确保您的目的地目录存在。
答案 1 :(得分:1)
而不是var upload = multer({ storage : storage }).array('userPic');
使用
var upload = multer({ storage : storage }).any('userPic');
<强> .ANY()强>
接受通过网络传输的所有文件。一系列文件将存储在req.files
。
答案 2 :(得分:1)
我刚刚发现了一些有关带有 multer 的 Express 中间件的信息。 如果您有多个函数需要充当中间件,则需要将数组作为中间件传递。
所以:
app.post('/uploads', isLoggedIn, upload.array('images'), (req, res) => {
console.log(req.files);
return res.send(req.files);
})
应该变成这样:
app.post('/uploads', [upload.array('images'), isLoggedIn], (req, res) => {
console.log(req.files);
return res.send(req.files);
})
注意:还要注意上传中间件需要先运行...我不知道为什么会发生这种情况,但这是它对我有用的唯一方法。
如果有人需要这方面的帮助,我只是把它放在那里(即使这个问题很老并且有一个公认的答案)。