我正在使用节点v0.10.26并表达v4.2.0,我对节点很新 . 在过去三个小时左右的时间里,我一直在我的 table 上打我的脑袋试图获得一个与节点一起使用的文件上传表单 . 在这一点上,我只是想让req.files不返回undefined . 我的观点看起来像这样
<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title>
<link rel='stylesheet' href='/stylesheets/style.css' />
</head>
<body>
<h1>{{ title }}</h1>
<p>Welcome to {{ title }}</p>
<form method='post' action='upload' enctype="multipart/form-data">
<input type='file' name='fileUploaded'>
<input type='submit'>
</form>
</body>
</html>
这是我的路线
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res) {
res.render('index', { title: 'Express' });
});
router.post('/upload', function(req, res){
console.log(req.files);
});
module.exports = router;
这是我的app.js
var express = require('express');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var routes = require('./routes/index');
var users = require('./routes/users');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hjs');
app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', routes);
app.use('/users', users);
/// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
/// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
module.exports = app;
我看到某个地方包括 methodOverride()
和 bodyParser({keepExtensions:true,uploadDir:path})
本来应该有所帮助,但如果我添加这些行,我甚至无法启动我的服务器 .
6 回答
ExpressJS问题:
大多数中间件都是从快递4中删除的 . 退房:http://www.github.com/senchalabs/connect#middleware对于像busboy,busboy-connect,强大,流量,分开的多部分中间件需要 .
此示例使用connect-busboy中间件 . create / img和/ public文件夹 .
使用文件夹结构:
\ server.js
\ img \“将内容上传到”
\ PUBLIC \ index.html的
SERVER.JS
INDEX.HTML
以下将与强大的SERVER.JS一起使用
另一个选择是使用multer,它在引擎盖下使用busboy,但设置起来比较简单 .
使用multer并设置上传目的地:
在视图中创建表单,multer工作需要
enctype='multipart/form-data
:然后在POST中,您可以访问有关该文件的数据:
有关此内容的完整教程可以在here找到 .
这是Mick Cullen的answer的简化版本(要点) - 部分是为了证明它不需要阅读页面和代码页面 .
你必须让你的应用程序使用connect-busboy:
在触发它之前,这不会做任何事情 . 在处理上传的调用中,执行以下操作:
让我们打破这个:
您检查是否设置了
req.busboy
(正确加载了中间件)您在
req.busboy
上设置"file"
侦听器您将
req
的内容管道传输到req.busboy
在文件监听器中有几个有趣的东西,但真正重要的是
fileStream
:这是Readable,然后可以像往常一样写入文件 .陷阱: You must handle this Readable, or express will never respond to the request ,见the busboy API( file 部分) .
我需要比其他答案提供更多细节(例如,如何将文件写入我在运行时决定的位置?) . 希望这对其他人有帮助:
得到连接busboy:
在您的server.js中,添加这些行
这似乎省略了错误处理,但如果我发现它将编辑它 .
我发现这个,简单而有效:
express-fileupload
Multer是一个用于处理multipart / form-data的node.js中间件,主要用于上传文件 . 它写在busboy之上,以实现最高效率 .