我已经为同样的问题看了很多答案,但我还没有找到合适的解决方案。我正在尝试创建一个Web应用程序,您可以使用express和multer上传文件,我遇到的问题是没有文件正在上传,并且req.file始终未定义。
我的代码如下
'use strict';
var express = require('express');
var path = require('path');
var multer = require('multer')
var upload = multer({ dest: 'uploads/' })
var app = express();
require('dotenv').load();
app.use(express.static(path.join(__dirname, 'main')));
app.post('/upload', upload.single('upl'), function (req, res, next) {
// req.file is the `avatar` file
// req.body will hold the text fields, if there were any
console.log(req.file);
res.status(204).end();
})
var port = process.env.PORT || 8080;
app.listen(port, function () {
console.log('Node.js listening on port ' + port + '...');
});
表格
<form class="uploadForm" action="/upload" method="post" enctype="multipart/formdata">
<label class="control-label">Select File</label>
<input name="upl" id="input-1" type="file" class="file">
<input type="submit" value="submit" />
</form>
非常感谢,这让我发疯。
你的enctype
略有不正确,它应该是multipart/form-data
而不是multipart/formdata
。
如果是邮递员,请尝试以下方法:
这可能会解决问题。每次重新启动服务器时,都需要执行上述步骤再次调用API。 multer的原因是将一些名为connect.sid的cookie发送回客户端,这可能需要进一步通信。使用旧cookie不会上传文件。
我把MY(有很多我想象的,肯定更好的)解决方案用来帮助很多像我这样的人,因为我在整整一天都进行了搜索;-(
//JS file on node side
var express = require('express');
var fileUpload = require('express-fileupload');
var fs = require("fs");
var app = express();
console.log('étape 0');
app.use(express.static('mesStatic'));
app.use(fileUpload());
console.log('étape 1');
app.get('/indexFileUpload.htm', function (req, res) {
res.sendFile( __dirname + "/" + "indexFileUpload.htm" );
})
console.log('étape 2');
app.post('/file_upload', function (req, res) {
console.log('étape 3');
console.log('req.files:' , req.files);
if (!req.files) {
res.send('No files to upload.');
return;
}
console.log('req.files.file.data:' , req.files.file.data);
var bufDataFile = new Buffer(req.files.file.data, "utf-8");
console.log('étape 3.1');
console.log('__dirname : ' + __dirname);
fs.writeFile(__dirname + '/file_upload/output.txt', bufDataFile, function(err) {
if (err) {
return console.error(err);
}
else {
console.log("Data written successfully !");
}
console.log('étape 4');
res.end('Fin OK !!!');
})
})
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
console.log("Example app listening at http://%s:%s", host, port);
})
HTML文件,
<form class="uploadForm" action="/upload" method="post" enctype="multipart/form-data">
<label class="control-label">Select File</label>
<input name="upl" id="input-1" type="file" class="file">
<input type="submit" value="submit" />
</form>
app.js
var express=require("express");
var multer=require("multer");
var app=express();
var upload=multer({dest:"uploads/"});
app.post("/upload",upload.single("upl"),function(req,res){
console.log("Uploaded Successfull with filename : "+req.upl.filename);
});
是的,你的enctype
是错误的,这是唯一的问题。确保您更正了enctype,否则您可能在req.file或req.files中未定义。
对我们来说这是因为我们在multer之前使用express-http-proxy
代理调用,我们需要使用parseReqBody: false
选项正确发送文件。
即。
app.post('file/upload', proxy(process.env.API_URL, {
parseReqBody: false,
}))