web-dev-qa-db-fra.com

Ne peut pas app.use (multer). erreur "requiert un middleware"

Je commence tout juste à apprendre NodeJS et je suis aux prises avec un problème. Je voudrais télécharger des fichiers sur mon serveur. Pour ce faire, j'ai cherché et découvert ce module multer . Faire comme l'exemple sur GitHub fonctionne:

var express = require('express');
var multer = require('multer');
var upload = multer({ dest: 'uploads/' });

var app = express()

app.post('/uploadImage', upload.single('image'), function(req, res) {
    console.log(req.file);
});

Lors de la publication d'une image avec FormData sur /uploadImage, l'image est enregistrée dans le répertoire uploads/. La chose est que l'image est enregistrée avec un nom étrange et je voudrais l'enregistrer avec son nom d'origine. Pour ce faire, j'ai compris qu'il me faudrait appeler app.use(multer({ dest: 'uploads/' }))' pour pouvoir accéder à req.file dans ma fonction, comme par exemple: 

app.post('/uploadImage', function(req, res) {
    console.log(req.file);
});

Mais j'obtiens une erreur en essayant app.use ():

TypeError: app.use() requires middleware functions
    at EventEmitter.use (project\node_modules\express\lib\application
.js:209:11)

J'utilise NodeJS 0.12.7 et Express 4.13.1

Comment puis-je réaliser ce téléchargement? Merci. 

36
João Menighin

Vous devez utiliser app.use(multer({dest:'./uploads/'})) sous l'une des formes suivantes:

app.use(multer({dest:'./uploads/'}).single(...));
app.use(multer({dest:'./uploads/'}).array(...));
app.use(multer({dest:'./uploads/'}).fields(...));

c'est à dire: 

app.use(multer({dest:'./uploads/'}).single('photo'));

Et assurez-vous d'avoir quelque chose comme:

<form action="/postPhotos" enctype="multipart/form-data" method="post">
    <input type="file" name="photo">
    <input type="submit" value="Upload photo">
</form>

Dans votre html.

54
Rubén Marrero
var app = require('express');

var multer = require('multer');

app=express();

app.use(multer({dest:__dirname+'/file/uploads/'}).any());

app.post('/upload',function(req,res){

    console.log(req.files);

    res.redirect('/');

});
16
Homar Roman Franco

La réponse de @ 127.0.0.1 est correcte, mais si vous utilisez Express Router, le code change un peu:

var express = require('express');
var multer = require('multer');

var router = express.Router();

var uploads = multer({
  dest: 'public/uploads/'
});

router.post('/upload', uploads.single('avatar'), function(req, res, next) {
  console.log(req.file);

  //...
});

Et le bit important, le form encoding devrait être enctype="multipart/form-data" comme déjà dit, comme ceci:

<form action="/upload" enctype="multipart/form-data" method="post">
    <input type="file" name="avatar">
    <input type="submit" value="Go avatar go!">
</form>
8
Salvatorelab

Depuis la version 1.0.0

var upload = multer({ dest: 'tmp/' });
app.post('/file_upload', upload.single('photo'), function (req, res) {
6
Jacek Wojcik

Passer à app.use (multer ({dest: './ uploads /'}). Single ('photo')); dans l'app.js fonctionne pour moi pour démarrer le serveur

3
Lekan Stephen

Vous ne pouvez pas modifier le nom du fichier à l'aide de multer mais vous pouvez utiliser le flux Node.js et le module fs pour copier le contenu du fichier déjà chargé dans un nouveau fichier (défini comme nom de fichier d'origine) du même dossier et supprimer l'ancien.

Tout d’abord, importez fs, path et multer dans votre script de noeud.

var express = require('express');
var multer = require('multer');
var fs = require('fs');
var pathModule = require('path');

Maintenant, définissez le répertoire de destination de tout type de fichiers en utilisant multer comme ci-dessous.

var app = express();
app.use(multer({dest:__dirname+'/resoucres/'}).any());

Maintenant, utilisez stream et fs pour résoudre votre problème.

app.post('/uploadImage', function(request, response) {
    var readerStream = fs.createReadStream(request.files[0].path);
    var dest_file = pathModule.join(request.files[0].destination, request.files[0].originalname);
    var writerStream = fs.createWriteStream(dest_file);

    var stream = readerStream.pipe(writerStream);
    stream.on('finish', function(){
        fs.unlink(request.files[0].path);
    });
});
2
Aditya

J'ai rencontré le même problème. Et je l'ai résolu. Pour le premier problème, comment obtenir le nom de fichier d'origine?

et l'autre question, comment utiliser "app.use ()"?
fait référence à: ici

0
Haifeng Fu