【发布时间】:2018-01-17 08:02:09
【问题描述】:
我目前正在尝试为我的应用程序实现文件上传,其中我使用 ReactJS、带有 express 的 node.js 以及 MongoDB 和猫鼬。我正在使用 multer 中间件进行文件上传,但是,尽管在 SO 上查看了所有类似的问题并进行了查找,但我似乎无法让它工作。
这是我的 React 表单:
addUser (event) {
var formfile = new FormData();
formfile.append("file", this.state.filesToBeSent);
axios.post('adduser',
JSON.stringify({
entry: this.state.currname,
passwrd: this.state.currpasswrd,
formfile : formfile
}), {
headers: {"Content-Type": "application/json"}
}
)
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
}
render() {
return (
<form onSubmit={this.addUser} encType="multipart/form-data" >
<input value={this.state.currname} />
<input value={this.state.currpasswrd} />
<input type="file" value={this.state.filesToBeSent} name="file" />
<button type="submit" >Add</button>
</form>
);
}
这是我的 node.js 文件:
var express = require('express');
var router = express.Router();
var mongoose = require('mongoose');
var User = require('../models/User.js');
var bodyParser = require('body-parser');
var multer = require("multer");
const uuidv4 = require("uuid/v4");
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cd(null, "./uploads");
},
filename: (req, file, cb) => {
const newFilename = `${uuidv4()}${path.extname(file.originalname)}`;
cb(null, newFilename);
},
})
const upload = multer({ storage });
router.post("/", upload.single("file"), (req, res) => {
console.log(req.file + " and exit.");
});
module.exports = router;
我还没有对文本输入做任何事情,因为我想让文件上传首先工作。
我尝试了很多东西,比如在router.post() 中使用async(req, res)。我尝试使用x-www-form-urlencoded 作为内容类型,并且只发送没有文本输入的文件(我指定formfile 作为要发送的数据而没有整个JSON.stringify(),但是,我没有设法让它工作.
谁能发现我的代码中的错误?或者是否有人对如何使其工作有任何其他想法?
编辑: 在 app.js 中设置 adduser-route:
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var adduser = require('./routes/adduser');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/adduser', adduser);
【问题讨论】:
-
您的后端代码是正确的,添加
console.log(req.file)...查看您是否从前端接收文件.....看起来前端有一些错误。 -
不太明白,我的函数里已经加了console.log(req.file)了,还是按你说应该加在哪里?
-
代码还是不够,你没有显示./routes/adduser.js的完整内容,可能有问题,需要返回router对象。我还建议将 app.use("/adduser") 放在 app.use(express.static(path.join(__dirname, 'public'))); 之前当你设置你的路线时。
-
@PhilippeLeefsma 我编辑了我的问题以显示 ./routes/adduser 的完整内容。非常感谢,我马上试试
-
看起来不错...用 app.use(express.static, ...) 交换 app.use('/adduser', adduser) 有帮助吗?
标签: javascript node.js reactjs express multer