请问在 Express 4.0 里如何实现上传?
发布于 10 年前 作者 youqingkui 18539 次浏览 最后一次编辑是 8 年前

是要在 app.js 里添加:

app.use(bodyParser({ keepExtensions: true, uploadDir: './public/images' }));  ?

我表单的 file 的名字为 file1,在接收请求里这样子写

router.post('/', function(req, res){
    console.log(req.files.file1);
});

会报:

TypeError: Cannot read property 'file1' of undefined

请问如何实现个简单上传?谢谢!

15 回复

使用multer中间件 app.use(require(‘multer’)({dest:__dirname + ‘/uploads’}));

4.0 的 bodyparser 不处理文件了啊…

要处理文件得用

https://github.com/andrewrk/connect-multiparty

我這樣子app.use(connect.multipart({ uploadDir: ‘./public/’ }));已經能夠上傳,但是如何在它沒有保存到文件夾的時候處理它呢?比如重命名?謝謝!

謝謝!已經可以了,但是我怎麼在文件保存到目的地的時候先處理它呢?

@youxiachai 恩,謝謝。就是文檔是英文的,到時還要請教下。

@youxiachai 我遇到个错误,我代码是这样子的: router.post(’/’, function(req, res){ var form = new multiparty.Form();
req.form.on(‘part’, function(part){ // transfer to s3 etc console.log(‘upload %s %s’, part.name, part.filename); var out = fs.createWriteStream(’/tmp/’ + part.filename); part.pipe(out); });

req.form.on(‘close’, function(){ res.end(‘uploaded!’); }); }); 我已经安装了组建并var multiparty = require(‘multiparty’);但是总是报这个错误:Cannot call method ‘on’ of undefined

@youqingkui 你用了connect-mutilparty 就完全没必要这么写了…

我给那个文档.是让你看看,配置参数.怎么配…

formidable +1 https://www.npmjs.org/package/formidable coffeescript 示例:

  form = new formidable.IncomingForm()
  form.parse req, (err, fields, files)->
      console.log files
      console.log fields

coffeescript + 1

connect-multiparty 的作者已经不推荐使用这个中间件了。其不会在上传后将之前生成的临时文件清除。

最好使用 formidable 或者busboy。

下面是简单的busboy使用示例

busboy = require 'connect-busboy'
...
app.use busboy()
...
app.post '/upload', (req,res)->
	req.pipe req.busboy
	req.busboy.on 'file', (fieldname, file, filename) ->
		...

multipartybusboy 不知道区别是什么,我选的前者,npm下载量是后者的10倍

multer吧 express官方推荐 自豪地采用 CNodeJS ionic

回到顶部