2012-05-18 27 views
1

我是相当新的表达和使用express.bodyParser来上传文件有问题。 bodyParser按照预期与req.body一起工作,所以它似乎被正确设置。我正在运行节点0.6.17并表达2.5.8。每当我尝试访问req.files时,它都是未定义的。有谁知道这个问题的原因是什么?Express.js文件上传

从app.js:

app.configure(function(){ 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.cookieParser()); 
    app.use(express.session({secret: "string" })); 
    app.use(flash()); 
    app.use(express.bodyParser()); 
    app.use(expressValidator); 
    app.use(express.methodOverride()); 
    app.use(express.static(__dirname + '/public')); 
    app.use(app.router); 
}); 

从index.js

app.get('/product/add', function(req, res) { 
    res.render("add_products", { 
     title: "Add Products", 
      email: req.session.email || 'Sign In/Up', 
     error: req.flash('error') || [] 
    }); 
}); 

app.post('/product/add', function(req, res) { 
console.log(req.files) // prints undefined 
var errors = generate_error_messages(req, 'product/add') || []; 
if (errors.length > 0) { 
    var errors_string_array = messages(errors); 
    req.flash('error', errors_string_array); 
    res.redirect('/product/add'); 
} else { 
    ProductDatabase.save(req, function(err, docs) { 
    res.redirect('/'); 
    }); 
} 
}); 

add_products.jade

form(class='form-horizontal', method='post', action='/product/add') 
    fieldset 
     .control-group 
     label(class='control-label', for="title") Product Title 
     .controls 
      input(type="text", class="input-xlarge", name="title") 
     .control-group 
     label(class='control-label', for="description") Description 
     .controls 
      textarea(class="input-xlarge", name="description", rows="5") 
     .control-group 
     label(class='control-label', for='auction_length') Auction Length 
     .controls 
      select(name='auction_length') 
      option 1 day 
      option 2 days 
      option 5 days 
     .control-group 
     label(class='control-label', for="fileInput") Upload Image 
     .controls 
      input(class='input-file', name='fileInput', type='file') 
     .form-actions 
     input(type="submit", class="btn btn-primary") Sell Product 
     a.btn(href='/') Cancel 
+0

你有没有考虑过用厉害? – ControlAltDel

+0

是的,我试图添加var form = new formidable.IncomingForm(); form.parse(req,function(err,fields,files){...}在帖子路径中,但是程序从未运行过解析方法 – user1403493

+0

Formidable被express使用 –

回答

0

如何 connect-form?这在我的经验中效果更好。

+0

我也试过,但它返回undefined就像bodyParser – user1403493

+3

在窗体中,将enctype设置为“multipart/form-data” – wrshawn

+0

谢谢,“multipart/form-data”做了诡计;) – user1403493

0

你在add_products.jade文件中有问题。

第一行形式标签应具有的enctype attribute.It应该是这样,

形式(类= '形横',方法= 'POST',动作= '/产品/添加',ENCTYPE =” multipart/form-data')

要发布文件,您应该拥有该属性。

0

简单上传你只需要这些配置:

app.use(express.static(__dirname + '/upload')); 
app.use(express.bodyParser({uploadDir:__dirname + '/upload'})); 

和玉模板:

form(method='post', action='/upload', enctype='multipart/form-data') 
    input(name='file', type='file') 
    input(type='submit')