简体   繁体   中英

Express.js File Uploads

I'm fairly new to express and am having problems with using express.bodyParser to to upload files. bodyParser works as expected with req.body, so it appears to be properly set up. I am running node 0.6.17 and express 2.5.8. Whenever I try to access req.files, it is undefined. Does anyone know what the cause of this issue is?

from 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);
});

from 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

How about connect-form ? That has worked better in my experience.

u have a problem in add_products.jade file.

First line form tag should have enctype attribute.It should be like,

form(class='form-horizontal', method='post', action='/product/add',enctype='multipart/form-data')

to post a file u should have that attribute.

for simple uploading you just need these configuration:

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

and in jade template:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM