2012-05-18 4 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

Рассматривали ли вы с помощью Formidable? – ControlAltDel

+0

Да, я попытался добавить var form = new formidable.IncomingForm(); form.parse (req, function (err, fields, files) {...} внутри почтового маршрута, но программа никогда не запускала метод разбора. – user1403493

+0

Formidable используется экспресс. –

ответ

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 должны быть такими, как,

форма (класс = 'форма горизонтальной', метод = 'пост', действие = '/ продукт/добавить', ENCTYPE =» multipart/form-data ')

, чтобы опубликовать файл u должен иметь этот атрибут.

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') 
Смежные вопросы