2014-04-28 23 views

Odpowiedz

3

express.bodyParser nie jest domyślnie uwzględniony w Express 4. Musisz zainstalować osobno. Zobacz https://github.com/expressjs/body-parser

Przykład:

var bodyParser = require('body-parser'); 

var app = connect(); 

app.use(bodyParser()); 

app.use(function (req, res, next) { 
    console.log(req.body) // populated! 
    next(); 
}) 

Istnieje również node-formidable

var form = new formidable.IncomingForm(); 

form.parse(req, function(err, fields, files) { 
    res.writeHead(200, {'content-type': 'text/plain'}); 
    res.write('received upload:\n\n'); 
    res.end(util.inspect({fields: fields, files: files})); 
}); 

return; 

Oto jak to zrobiłem:

form = new formidable.IncomingForm(); 
form.uploadDir = __dirname.getParent() + "/temp/"; 
form.parse(req, function(err, fields, files) { 
    var newfile, path, uid, versionName; 
    uid = uuid.v4(); 
    newfile = __dirname.getParent() + "/uploads/" + uid; 
    copyFile(files.file.path, newfile, function(err) { 
    if (err) { 
     console.log(err); 
     req.flash("error", "Oops, something went wrong! (reason: copy)"); 
     return res.redirect(req.url); 
    } 
    fs.unlink(files.file.path, function(err) { 
     if (err) { 
     req.flash("error", "Oops, something went wrong! (reason: deletion)"); 
     return res.redirect(req.url); 
     } 
     // done! 
     // ... 
    }); 
    }); 
}); 
+0

Odpowiedź jest właściwa, należy użyć oprogramowania pośredniego trzeciej części. Ale użyłem funkcji connect-multiparty. Następnie mogę użyć pliku req.files do pobrania plików. – vcLwei

+1

używanie analizatora treści w wyrażeniu 4.x jest przestarzałe i [z bardzo dobrego powodu] (http://andrewkelley.me/post/do-not-use-bodyparser-with-express-js.html) – uiron

21

prostu miałem ten problem po aktualizacji, gdzie req.files był niezdefiniowany. Naprawiłem to za pomocą multer.

Więc

npm install multer 

a następnie w swoim app.js

var multer = require('multer'); 
app.use(multer({ dest: './tmp/'})); 

nie trzeba zmieniać niczego innego po tym i cały mój stary funkcjonalność pracował.

+0

Użyłem multer zgodnie z twoją rekomendacją i jest dobry. Ale nie ma kontroli nad przesłanym plikiem w poście, jak mogę zarządzać dwoma różnymi adresami URL-a pliku, gdzie raz, chciałbym zmienić nazwę pliku, a nie zmienić jego nazwy. Pytam, ponieważ funkcja "zmień nazwę" jest zdefiniowana raz i wygląda na to, że zostanie zastosowana do wszystkich instancji plików. – codin

+1

Nie jesteś pewien co masz na myśli. Na mojej faktycznej trasie, w której przetwarzam pliki, nie odwołuję się nawet do 'multer' (' multer' jest właśnie używany w moim 'app.js'). Używam tylko req.files [0], req.files [1], etc w mojej trasie i używam 'fs.readFile' i' fs.writeFile', aby to przenieść. Od Express 3 do Express 4, nic z tego dla mnie nie zmieniło ... po prostu dodano 'multer' w Express 4 i wszystkie stare funkcje działały ... Być może będziesz musiał wysłać pytanie z przykładem kodu. – MikeSmithDev

+0

W tej chwili używam multer z Twojego kodu i otrzymuję 'TypeError: multer nie jest funkcją' – Musa

Powiązane problemy