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.
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.
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('/');
});
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>
Depuis la version 1.0.0
var upload = multer({ dest: 'tmp/' });
app.post('/file_upload', upload.single('photo'), function (req, res) {
Passer à app.use (multer ({dest: './ uploads /'}). Single ('photo')); dans l'app.js fonctionne pour moi pour démarrer le serveur
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);
});
});
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