实际上,我的代码有问题,我看不出问题出在哪里。
我有这个AJAX部分,它从表单和参数中获取文件并将其发送到我的nodejs服务器:
var layerID = 2;
var formData = new FormData($("#formid")[0]);
formData.append('layer', layerID);
$.ajax({
url: "http://localhost:3000/file-upload",
type: 'POST',
data: formData,
cache: false,
contentType: false,
processData: false
});
我有Express这部分,应该用来接收文件和参数:
app.use(bodyParser.urlencoded({
extended: false
}))
app.post('/file-upload', function (req, res) {
console.log('params: ' + req.params);
console.log('body: ' + req.body);
console.log('query: ' + req.query);
upload(req, res, function (err) {
if (err) {
errorHandler
return
} else {
successHandler
}
})
})
我的问题是我可以正确接收文件,但是在我的nodejs服务器中没有收到参数“ layer”。有人可以帮我纠正此错误吗?谢谢。
答案 0 :(得分:1)
您要发布多部分数据,但是您只有urlencoded
数据的正文解析器。
请参阅body parser的文档:
由于多主体的复杂性和 通常是大自然。对于多部分实体,您可能会感兴趣 以下模块:
- busboy和connect-busboy
- 多方和连接多方
- 可塑
- multer
答案 1 :(得分:1)
您可以使用multiparty
之类的包通过以下方式解析多部分数据。还有其他软件包。
const multiparty = require('multiparty');
// Define POST route
app.post('/file-upload', function (req, res) {
const form = new multiparty.Form();
form.parse(request, async (error, fields, files) => {
if (error) throw new Error(error);
try {
const path = files.file[0].path;
const layer = fields && fields.layer && fields.layer[0]
const buffer = fs.readFileSync(path);
// TODO
return response.status(200).send(data);
} catch (error) {
return response.status(400).send(error);
}
});
}
您可以通过这种方式使用它。您可以从字段中阅读。
const formData = new FormData();
formData.append('file', fileObj);
uploadHandler(formData) // this function will make an API call
现在您将可以得到files.file[0]
答案 2 :(得分:0)
我找到了解决方案,解决方案是简单地将我的req.body日志移动到上载函数中,并这样调用:console.log(“ layer:” + req.body ['layer']); < / p>