Javascript Multer返回未定义的req.file
我知道这个问题以前已经被问过很多次了,我也尝试过实施这些解决方案,但它们对我来说并不奏效 我一直在绞尽脑汁想弄清楚如何上传文件并通过节点读取文件大小。我最初尝试使用强大的npm,它似乎不再被维护,因为我找不到关于它的文档。我无法处理错误,所以我尝试使用multer。但是,当我尝试记录req.file时,我会反复得到一个未定义的日志 我有下面的server.js代码Javascript Multer返回未定义的req.file,javascript,jquery,ajax,node.js,express,Javascript,Jquery,Ajax,Node.js,Express,我知道这个问题以前已经被问过很多次了,我也尝试过实施这些解决方案,但它们对我来说并不奏效 我一直在绞尽脑汁想弄清楚如何上传文件并通过节点读取文件大小。我最初尝试使用强大的npm,它似乎不再被维护,因为我找不到关于它的文档。我无法处理错误,所以我尝试使用multer。但是,当我尝试记录req.file时,我会反复得到一个未定义的日志 我有下面的server.js代码 var express = require('express'); var formidable = require('formid
var express = require('express');
var formidable = require('formidable');
var multer = require('multer');
var path = require('path');
var upload = multer({dest: './uploads'});
var fs = require('fs');
var app = express();
var PORT = 8080;
app.use(express.static(__dirname+'/views'));
app.set('views', './views');
app.set('view engine', 'jade');
app.get('/', function(req, res){
res.render('index.jade');
});
app.post('/upload', upload.single('Upload'),function(req, res){
console.log(req.file);
});
app.listen(PORT, function(){
console.log('Express listening on port: '+PORT);
});
下面提供了带有AJAX调用的javascript代码
$('#upload-butt').on('change', function(){
var file = $(this).get(0).files;
console.log(typeof file);
if(file.length > 0){
var formData = new FormData();
formData.append('Upload', file, file.name);
$.ajax({
url: '/upload',
type: 'POST',
data:formData,
processData:false,
contentType:false,
error: function(jXhr, status){
console.log('error: '+status);
},
success: function(data){
console.log('upload successful: '+data);
}
})
}
});
我的index.jade代码如下所示
html
head
link(rel='stylesheet', href='style.css', type='text/css')
title Upload file for shortening
body
h1 Welcome to file metadata service
div(id='upload-button')
form(enctype='multipart/form-data', method='post', action='/upload')
input(name='Upload', type='file', id='upload-butt')
div(id="submit-button")
form(action = '/submit')
button(type="submit", value='Submit', id='submit-butt') Submit
script(src="https://code.jquery.com/jquery-2.2.0.min.js")
script(src="upload.js")
我已经准备好了,所以我将非常感谢任何能在这里帮助我的人!谢谢 您提交的
与带有图像的不同,正确的方法是将所有内容放在一个
中。这样,您就可以提交包含该文件的表单
html
head
link(rel='stylesheet', href='style.css', type='text/css')
title Upload file for shortening
body
h1 Welcome to file metadata service
div(id='upload-button')
form(enctype='multipart/form-data', method='post', action='/upload')
input(name='Upload', type='file', id='upload-butt')
button(type="submit", value='Submit', id='submit-butt') Submit
script(src="https://code.jquery.com/jquery-2.2.0.min.js")
script(src="upload.js")
对于翡翠部分来说,这应该有用
您没有正确应用中间层
您可以使用以下内容:
var express = require('express')
var multer = require('multer')
var app = express()
app.use(multer({ dest: './uploads/'}))
You can access the fields and files in the request object:
console.log(req.body)
console.log(req.files)
因此,同样地,在你的代码中,你必须应用
var express = require('express');
var formidable = require('formidable');
var multer = require('multer');
var path = require('path');
var upload = multer({dest: './uploads'});
var fs = require('fs');
var app = express();
var PORT = 8080;
app.use(upload);
app.use(express.static(__dirname+'/views'));
app.set('views', './views');
app.set('view engine', 'jade');
app.get('/', function(req, res){
res.render('index.jade');
});
app.post('/upload', upload.single('Upload'),function(req, res){
console.log(req.file);
});
app.listen(PORT, function(){
console.log('Express listening on port: '+PORT);
});
这将返回以下错误类型错误:app.use()还需要中间件函数,但在multer文档中没有提到我们需要使用app.use()调用中间件的任何地方。中间件作为get请求方法的一部分被调用。我尝试过这个,但是没有什么不同,因为我根本没有使用提交按钮。我本想把它拿走的,但我忘了。req.file控制台日志仍然未定义。因此,在这种情况下,为什么要使用jQuery调用ajax
,按下表单提交按钮应该会当场触发有效的post请求,对吗?您是否从jQuery收到成功通知?我不完全确定如何使提交按钮与post请求交互。我的印象是,无论如何,您都必须提出AJAX请求。不管怎样,我去掉了提交按钮。是的,我从jQuery收到了成功通知。但是回调中的数据变量只是一个读取success的字符串。我认为数据变量应该是一个包含上传文件的对象或缓冲区。