当在Nodejs中上传文件时,Formidable没有form.parse() [英] Formidable doesnt form.parse() when uploading a file in Nodejs

查看:1661
本文介绍了当在Nodejs中上传文件时,Formidable没有form.parse()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我发送一个文件/上传,从终端,我可以看到,代码被封锁在form.parse(请求...在互联网上我读到,这是因为我使用bodyParser(),和人们建议要做到这一点:$ b​​
$ pre code删除express.bodyParser.parse ['multipart / form-data'];
code>

然而,当我这样做时,我的代码崩溃,因为解析为null。



任何人有任何想法如何获得文件上传工作只在/上传,可能与强大?



谢谢。



这是我的 app.js

 'use strict'; 

var express = require(express);
var async = require(async);
var http = require('http');
var url = require (url);
var qs = require(querystring);
var fs = require(fs);
var formidable = require(formidable);
var mime = require(mime);

var app = module.exports = express();

app.configure ction(){
app.set(views,__dirname +/ views);
app.set(view engine,ejs);
app.engine(html,ejs.renderFile);
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser(abc));
app.use(express.static(__ dirname +/ static));
app.use(app.router);
app.use(express.limit('5mb'));
});

app.post('/ upload',storage.upload);

这是我的代码 storage.js

 'use strict'; 

var async = require('async');
var formidable = require('formidable');
var fs = require('fs');
var util = require('util');
var api = require('./ common');
$ b $ exports.upload = function(req,res){

console.log(我在这里);

var form = new formidable.IncomingForm(),
files = [],
fields = [];

form.uploadDir =./uploads;
$ b form
.on('field',function(field,value){
console.log(field,value);
fields.push([field ,value]);
})
.on('error',function(err){
res.writeHead(200,{'content-type':'text / plain'} );
res.end('error:\\\
\\\
'+ util.inspect(err));
})
.on('file',function(field,文件){
console.log(field,file);
files.push([field,file]);
})
.on('aborted',function err){
console.log(user aborted upload);
})
.on('end',function(){
console.log(' - > ;上传完成');
res.writeHead(200,{'content-type':'text / plain'});
res.write('received fields:\\\
\\\
' + util.inspect(fields));
res.write('\\\
\\\
');
res.end('received files:\\\
\\\
'+ util.inspect (files));
});
form.parse(req);
};


解决方案

你看过github上的例子: https://github.com/visionmedia/express/blob/master/examples/ multipart / index.js



我修改了它在Express 3.x上运行,它似乎工作顺利:

  var express = require('express'); 
var fs = require('fs');
var app = express();
var format = require('util')。format;


//连接2.x中的bodyParser使用node-formidable来解析
//多部分表单数据。
app.use(express.bodyParser())

app.get('/',function(req,res){
res.send('< form method =postenctype =multipart / form-data>'
+'< p>标题:< input type =textname =title/>< / p>'
+'< p>图片:< input type =filename =image/>< / p>'
+'< p>< input type =提交value =上传/>< / p>'
+'< / form>');
});
$ b $ app.post('/',function(req,res,next){
//上传的文件可以被找到为'req.files.image`和
// title字段作为`req.body.title`
res.send(格式('\\\
uploaded%s(%d Kb)到%s为%s'
,req.files。 image.name
,req.files.image.size / 1024 | 0
,req.files.image.path
,req.body.title));
}) ;

if(!module.parent){
app.listen(3000);
console.log('Express on port 3000');
}


When i send a file to /upload, from the terminal I can see that the code is blocked at form.parse(req... On the Internet I read that this is because I use bodyParser(), and people suggested to do this:

delete express.bodyParser.parse['multipart/form-data'];

however when I do that my code crashes since parse is null.

Anyone has any idea on how to get file upload working only in /upload and possibly with formidable?

Thanks.

This is my app.js:

'use strict';

var express = require("express");
var async = require("async");
var http = require('http');
var url = require("url");
var qs = require("querystring");
var fs = require("fs");
var formidable = require("formidable");
var mime = require("mime");

var app = module.exports = express();

app.configure(function () {
  app.set("views", __dirname + "/views");
  app.set("view engine", "ejs");
  app.engine("html", ejs.renderFile);
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser("abc"));
  app.use(express.static(__dirname + "/static"));
  app.use(app.router);
  app.use(express.limit('5mb'));
});

app.post('/upload', storage.upload);

This is my code storage.js:

'use strict';

var async = require('async');
var formidable = require('formidable');
var fs = require('fs');
var util = require('util');
var api = require('./common');

exports.upload = function (req, res) {

  console.log("I am here");

  var form = new formidable.IncomingForm(),
    files = [],
    fields = [];

  form.uploadDir = "./uploads";

  form
    .on('field', function (field, value) {
      console.log(field, value);
      fields.push([field, value]);
    })
    .on('error', function (err) {
      res.writeHead(200, {'content-type': 'text/plain'});
      res.end('error:\n\n'+util.inspect(err));
    })
    .on('file', function (field, file) {
      console.log(field, file);
      files.push([field, file]);
    })
    .on('aborted', function (err) {
      console.log("user aborted upload");
    })
    .on('end', function () {
      console.log('-> upload done');
      res.writeHead(200, {'content-type': 'text/plain'});
      res.write('received fields:\n\n '+util.inspect(fields));
      res.write('\n\n');
      res.end('received files:\n\n '+util.inspect(files));
    });
  form.parse(req);
};

解决方案

Have you seen the example on github: https://github.com/visionmedia/express/blob/master/examples/multipart/index.js

I've modified it to run on Express 3.x and it seems to work smoothly:

var express = require('express');
var fs = require('fs');
var app = express();
var format = require('util').format;


// bodyParser in connect 2.x uses node-formidable to parse 
// the multipart form data.
app.use(express.bodyParser())

app.get('/', function(req, res){
  res.send('<form method="post" enctype="multipart/form-data">'
    + '<p>Title: <input type="text" name="title" /></p>'
    + '<p>Image: <input type="file" name="image" /></p>'
    + '<p><input type="submit" value="Upload" /></p>'
    + '</form>');
});

app.post('/', function(req, res, next){
  // the uploaded file can be found as `req.files.image` and the
  // title field as `req.body.title`
  res.send(format('\nuploaded %s (%d Kb) to %s as %s'
    , req.files.image.name
    , req.files.image.size / 1024 | 0 
    , req.files.image.path
    , req.body.title));
});

if (!module.parent) {
  app.listen(3000);
  console.log('Express started on port 3000');
}

这篇关于当在Nodejs中上传文件时,Formidable没有form.parse()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆