The Error:
Error: Unexpected field
at makeError (c:UsersDevWebstormProjectsCrunchnode_modulesmulterlibmake-error.js:12:13)
at wrappedFileFilter (c:UsersDevWebstormProjectsCrunchnode_modulesmulterindex.js:39:19)
at Busboy.<anonymous> (c:UsersDevWebstormProjectsCrunchnode_modulesmulterlibmake-middleware.js:97:7)
at Busboy.emit (events.js:118:17)
at Busboy.emit (c:UsersDevWebstormProjectsCrunchnode_modulesmulteode_modulesbusboylibmain.js:31:35)
at PartStream.<anonymous> (c:UsersDevWebstormProjectsCrunchnode_modulesmulteode_modulesbusboylibtypesmultipart.js:205:13)
at PartStream.emit (events.js:107:17)
at HeaderParser.<anonymous> (c:UsersDevWebstormProjectsCrunchnode_modulesmulteode_modulesbusboynode_modulesdicerlibDicer.js:51:16)
at HeaderParser.emit (events.js:107:17)
at HeaderParser._finish (c:UsersDevWebstormProjectsCrunchnode_modulesmulteode_modulesbusboynode_modulesdicerlibHeaderParser.js:70:8)
My app.js:
var express = require('express');
var http = require('http');
var path = require('path');
var fs = require('fs');
var https = require("https");
var multer = require('multer');
process.env.PATH = '/usr/bin';
// all environments
app.set('port', process.env.PORT || 443); //Environment or HTTPS only
//app.set('view engine', 'html');
//HTTP
var redirectApp = express()
, redirectServer = http.createServer(redirectApp);
redirectApp.use(function (req, res, next) {
if (!req.secure) {
retu res.redirect('https://' + req.headers.host + req.url);
}
next();
});
redirectServer.listen(80, function() {
console.log("Redirect instance ruing on port 80.");
});
__diame = '/var/www/html';
app.all('*', function(req, res, next) {
res.header('Access-Control-Allow-Origin', "*");
res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
res.header('Access-Control-Allow-Headers', "Origin, X-Requested-With, Content-Type, Accept");
next();
});
app.use(bodyParser.json({limit: "50mb"}));
app.use(useragent.express());
app.set('views', path.join(__diame));
app.use(morgan('combined'));
app.use(express.static('/var/www/html'));
app.engine('html', require('ejs').renderFile);
app.post("/postFile", multer().array(), function (req, res, next) {
console.log("please work");
});
require('./routes/main.js')(app);
https.createServer(options, app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
I'm using KendoUI File Upload on the frontend:
<form id="forFile" action="/postFile" method="POST" enctype="multipart/form-data">
<div class="form-group">
<label for="inputFile">Upload Attachments</label>
<div class="col-sm-offset-2 col-sm-10 pull-right">
<input type="file" id="inputFile" name="inputFile">
</div>
</div>
</form>
Initialized with:
$("#inputFile").kendoUpload({
multiple: false,
async: {
saveUrl: "postFile",
removeUrl: "removeFile",
autoUpload : true
},
complete: onComplete
});
I know this is a near duplicate of a few question on Stack overflow, but the answer to all of these questions is to make the name property match the upload.array or upload.single argument (I have tried both), which is currently satisfied in my code as you can see by the route that catches my upload:
var multer = require("multer");
var upload = multer({ dest: "upload/" });
var type = upload.array('inputFile', 1); //KendoUI
app.post('/postFile', type, function (req, res) {
var tmp_path = req.file.path;
/** The original name of the uploaded file
stored in the variable "originalname". **/
var target_path = 'uploads/' + req.file.originalname;
/** A better way to copy the uploaded file. **/
var src = fs.createReadStream(tmp_path);
var dest = fs.createWriteStream(target_path);
src.pipe(dest);
src.on('end', function() { res.render('complete'); });
src.on('error', function(err) { res.render('error'); });
sendJsonResponse(res, 200, "you posted a file");
});
