下面的代码是我的Node.js上传文件。此代码工作正常,可以从客户端上传任何文件,但上传后,我无法获得上传状态结果。例如在Node.js上,上传文件后,我无法将上传结果发送给客户端。
var socket = require('socket.io');
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = socket.listen(server);
var port = process.env.PORT || 3000;
var mysql = require('mysql');
var multer = require('multer');
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'a',
database: 'signal'
});
var storage = multer.diskStorage({
destination: function (req, file, callback) {
callback(null, './uploads');
},
filename: function (req, file, callback) {
callback(null, req.params.storeId);
}
});
var upload = multer({storage: storage}).single('userPhoto');
app.post('/newVitrine/:storeId/:userId', function (req, res) {
upload(req, res, function (err) {
if (err) {
res.send({'result': 0});
console.log({'result': 0});
} else {
res.send({'result': 1});
console.log({'result': 1});
}
});
});
server.listen(port, function () {
console.log('Server listening at port %d', port);
});
客户端应该将json对象作为{'result': 1}
,但我得到的是长json对象而result
不在其中。
答案 0 :(得分:1)
简短回答:你无能为力。你可以使用ajax并伪造它;使它看起来像预期的那样工作。即使是文件上传服务也是如此 - 例如transloadit。
问题实际上是一个非常普遍的问题,如果multer达到大小限制超过,发生这种情况(虽然我的情况有点不同),它会中止连接并导致问题;您无法在中止连接时向客户端发送响应。
检查这个解释很多的完美答案:
How to cancel HTTP upload from data events?
以下是工作示例:
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var multer = require('multer');
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, './temp')
},
filename: function (req, file, cb) {
cb(null, file.fieldname + '-' + Date.now())
}
});
var upload = multer({storage: storage}).single('upload');
app.get('/', function (req, res) {
res.send(`<form action="/upload" enctype="multipart/form-data" id="upld" method="post">
<input type="text" name="title"><br>
<input type="file" name="upload" multiple="multiple"><br>
<input type="submit" value="Upload" id="upldbtn">
</form>
`
);
});
app.post('/upload', function (req, res) {
upload(req, res, function (err) {
if (err) {
res.send({'result': 0});
console.log(err);
} else {
res.send({'result': "custom result"});
console.log({'result': 1});
}
});
});
server.listen("9090", function () {
console.log('Server listening at port');
});