Chargement d'images à L'aide de Node.js, Express et Mongoose

veuillez tenir compte des nouvelles réponses qui contiennent des renseignements plus à jour, car les choses ont changé au fil des ans!

depuis beaucoup de nouveau noeud.les bibliothèques js sont rapidement devenues obsolètes et il y a relativement peu d'exemples que je voudrais demander pour télécharger des images en utilisant les dernières versions de Node.js (v0.4.1), Express (1.0.7), et Mongoose (1.1.0). Comment d'autres ont-ils fait?

j'ai trouvé: https://github.com/felixge/node-formidable , mais je suis nouveau à télécharger des images en général si je veux apprendre des choses générales et les façons de le faire en utilisant noeud.js et Express.

98
demandé sur bjb568 2011-03-01 04:25:25

12 réponses

je répondrai à ma question pour la première fois. J'ai trouvé un exemple directement de la source. Veuillez pardonner la pauvre indentation. Je n'étais pas sûr de savoir comment bien indenter lors de la copie et collage. Le code vient tout droit de L'Express multipart/form-data exemple sur GitHub.

// Expose modules in ./support for demo purposes
require.paths.unshift(__dirname + '/../../support');

/**
 * Module dependencies.
 */

var express = require('../../lib/express')
  , form = require('connect-form');

var app = express.createServer(
  // connect-form (http://github.com/visionmedia/connect-form)
  // middleware uses the formidable middleware to parse urlencoded
  // and multipart form data
  form({ keepExtensions: true })
);

app.get('/', function(req, res){
  res.send('<form method="post" enctype="multipart/form-data">'
    + '<p>Image: <input type="file" name="image" /></p>'
    + '<p><input type="submit" value="Upload" /></p>'
    + '</form>');
});

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

  // connect-form adds the req.form object
  // we can (optionally) define onComplete, passing
  // the exception (if any) fields parsed, and files parsed
  req.form.complete(function(err, fields, files){
    if (err) {
      next(err);
    } else {
      console.log('\nuploaded %s to %s'
        ,  files.image.filename
        , files.image.path);
      res.redirect('back');
    }
  });

  // We can add listeners for several form
  // events such as "progress"
  req.form.on('progress', function(bytesReceived, bytesExpected){
    var percent = (bytesReceived / bytesExpected * 100) | 0;
    process.stdout.write('Uploading: %' + percent + '\r');
  });
});

app.listen(3000);
console.log('Express app started on port 3000');
74
répondu JohnAllen 2013-03-14 13:22:58

puisque vous utilisez express, ajoutez simplement bodyParser:

app.use(express.bodyParser());

ensuite votre route a automatiquement accès vers le fichier téléchargé(s) dans req.fichiers:

app.post('/todo/create', function (req, res) {
    // TODO: move and rename the file using req.files.path & .name)
    res.send(console.dir(req.files));  // DEBUG: display available fields
});

si vous nommez le contrôle d'entrée "todo" comme ceci (en Jade):

form(action="/todo/create", method="POST", enctype="multipart/form-data")
    input(type='file', name='todo')
    button(type='submit') New

puis le fichier téléchargé est prêt au moment où vous obtenez le chemin et le nom du fichier original dans les fichiers'.todo':

  • req.fichier.todo.chemin d'accès, et
  • req.des dossiers.todo.nom

autre demande utile.propriétés des fichiers:

  • taille (en octets)
  • type (par exemple, 'image/png')
  • lastModifiedate
  • _writeStream.encodage (E. g, "binaire")
47
répondu Brent Faust 2013-07-10 18:05:04

vous pouvez configurer le middleware de l'analyseur de corps de connexion dans un bloc de configuration dans votre fichier d'application principal:

    /** Form Handling */
    app.use(express.bodyParser({
        uploadDir: '/tmp/uploads',
        keepExtensions: true
    }))
    app.use(express.limit('5mb'));
19
répondu srquinn 2014-05-11 22:56:33

Voir, la meilleure chose que vous pouvez faire est de simplement télécharger l'image sur le disque et enregistrer l'URL dans MongoDB. Reposez-vous quand vous récupérez l'image à nouveau. Il suffit de spécifier L'URL, et vous obtiendrez une image. Le code de téléchargement est le suivant.

app.post('/upload', function(req, res) {
    // Get the temporary location of the file
    var tmp_path = req.files.thumbnail.path;
    // Set where the file should actually exists - in this case it is in the "images" directory.
    target_path = '/tmp/' + req.files.thumbnail.name;
    // Move the file from the temporary location to the intended location
    fs.rename(tmp_path, target_path, function(err) {
        if (err)
            throw err;
        // Delete the temporary file, so that the explicitly set temporary upload dir does not get filled with unwanted files.
        fs.unlink(tmp_path, function() {
            if (err)
                throw err;
            //
        });
    });
});

sauvegardez maintenant le chemin cible dans votre base de données MongoDB.

encore une fois, tout en récupérant l'image, il suffit d'extraire l'URL de la base de données MongoDB, et de l'utiliser sur cette méthode.

fs.readFile(target_path, "binary", function(error, file) {
    if(error) {
        res.writeHead(500, {"Content-Type": "text/plain"});
        res.write(error + "\n");
        res.end();
    }
    else {
        res.writeHead(200, {"Content-Type": "image/png"});
        res.write(file, "binary");
    }
});
14
répondu Nilesh 2014-05-13 03:24:15

essayez ce code.Ça aidera.

app.get('/photos/new', function(req, res){
  res.send('<form method="post" enctype="multipart/form-data">'
    + '<p>Data: <input type="filename" name="filename" /></p>'
    + '<p>file: <input type="file" name="file" /></p>'
    + '<p><input type="submit" value="Upload" /></p>'
    + '</form>');
});


 app.post('/photos/new', function(req, res) {
  req.form.complete(function(err, fields, files) {
    if(err) {
      next(err);
    } else {
      ins = fs.createReadStream(files.photo.path);
      ous = fs.createWriteStream(__dirname + '/directory were u want to store image/' + files.photo.filename);
      util.pump(ins, ous, function(err) {
        if(err) {
          next(err);
        } else {
          res.redirect('/photos');
        }
      });
      //console.log('\nUploaded %s to %s', files.photo.filename, files.photo.path);
      //res.send('Uploaded ' + files.photo.filename + ' to ' + files.photo.path);
    }
  });
});

if (!module.parent) {
  app.listen(8000);
  console.log("Express server listening on port %d, log on to http://127.0.0.1:8000", app.address().port);
}
9
répondu Dar Hamid 2011-11-10 06:53:48

vous pouvez également utiliser ce qui suit pour définir un chemin où il sauve le fichier.

req.form.uploadDir = "<path>";
8
répondu Manuela 2014-05-11 22:55:42

I a créé un exemple qui utilise Express et Multer. Il est très simple et évite tous Connect warnings

ça pourrait aider quelqu'un.

5
répondu Jon J 2014-05-13 03:25:09

encore une fois si vous ne voulez pas utiliser bodyParser, les travaux suivants:

var express = require('express');
var http = require('http');
var app = express();

app.use(express.static('./public'));


app.configure(function(){
    app.use(express.methodOverride());
    app.use(express.multipart({
        uploadDir: './uploads',
        keepExtensions: true
    }));
});


app.use(app.router);

app.get('/upload', function(req, res){
    // Render page with upload form
    res.render('upload');
});

app.post('/upload', function(req, res){
    // Returns json of uploaded file
    res.json(req.files);
});

http.createServer(app).listen(3000, function() {
    console.log('App started');
});
2
répondu Squidinker 2014-04-12 10:33:46

pour Express 3.0, si vous voulez utiliser les événements formidables, vous devez supprimer l'middleware multipart, de sorte que vous pouvez créer la nouvelle instance de celui-ci.

pour faire ceci:

app.use(express.bodyParser());

peut s'écrire comme:

app.use(express.json());
app.use(express.urlencoded());
app.use(express.multipart()); // Remove this line

et maintenant créer l'objet forme:

exports.upload = function(req, res) {
    var form = new formidable.IncomingForm;
    form.keepExtensions = true;
    form.uploadDir = 'tmp/';

    form.parse(req, function(err, fields, files){
        if (err) return res.end('You found error');
        // Do something with files.image etc
        console.log(files.image);
    });

    form.on('progress', function(bytesReceived, bytesExpected) {
        console.log(bytesReceived + ' ' + bytesExpected);
    });

    form.on('error', function(err) {
        res.writeHead(400, {'content-type': 'text/plain'}); // 400: Bad Request
        res.end('error:\n\n'+util.inspect(err));
    });
    res.end('Done');
    return;
};

j'ai aussi posté ceci sur mon blog, obtenir formidable objet de forme dans Express 3.0 sur le téléchargement .

2
répondu Risto Novik 2014-05-13 03:21:32

je sais que la question originale se rapportait à des versions spécifiques, mais elle se référait aussi à la "dernière" - le post de @JohnAllen n'est plus pertinent en raison de Expressjs bodyParser et connect-formulaire

cela démontre la facilité d'utilisation dans bodyParser ():

 /**
 * Module dependencies.
 */

var express = require('express')

var app = express()
app.use(express.bodyParser({ keepExtensions: true, uploadDir: '/home/svn/rest-api/uploaded' }))

app.get('/', function(req, res){
  res.send('<form method="post" enctype="multipart/form-data">'
    + '<p>Image: <input type="file" name="image" /></p>'
    + '<p><input type="submit" value="Upload" /></p>'
    + '</form>');
});

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

    res.send('Uploaded: ' + req.files.image.name)
    return next()

});

app.listen(3000);
console.log('Express app started on port 3000');
1
répondu GMeister 2017-05-23 12:09:52

Voici une façon de télécharger vos images en utilisant le formidable package, qui est recommandé sur bodyParser dans les versions ultérieures D'Express. Cela inclut aussi la possibilité de redimensionner vos images à la volée:

téléchargement et redimensionnement D'Images (à la volée) avec noeud.js et Express .

Voici l'essentiel:

var express = require("express"),
app = express(),
formidable = require('formidable'),
util = require('util')
fs   = require('fs-extra'),
qt   = require('quickthumb');

// Use quickthumb
app.use(qt.static(__dirname + '/'));

app.post('/upload', function (req, res){
  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}));
  });

  form.on('end', function(fields, files) {
    /* Temporary location of our uploaded file */
    var temp_path = this.openedFiles[0].path;
    /* The file name of the uploaded file */
    var file_name = this.openedFiles[0].name;
    /* Location where we want to copy the uploaded file */
    var new_location = 'uploads/';

    fs.copy(temp_path, new_location + file_name, function(err) {  
      if (err) {
        console.error(err);
      } else {
        console.log("success!")
      }
    });
  });
});

// Show the upload form 
app.get('/', function (req, res){
  res.writeHead(200, {'Content-Type': 'text/html' });
  /* Display the file upload form. */
  form = '<form action="/upload" enctype="multipart/form-data" method="post">'+ '<input name="title" type="text" />
  '+ '<input multiple="multiple" name="upload" type="file" />
  '+ '<input type="submit" value="Upload" />'+ '</form>';
  res.end(form); 
}); 
app.listen(8080);

NOTE: ceci nécessite un Magick D'Image pour le redimensionnement rapide du pouce.

0
répondu Tony Spiro 2014-07-13 07:31:35

il y a ma méthode pour télécharger plusieurs fichiers:

Nodejs:

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

var multiparty = require('multiparty');
var form = new multiparty.Form();
var fs = require('fs');

form.parse(req, function(err, fields, files) {  
    var imgArray = files.imatges;


    for (var i = 0; i < imgArray.length; i++) {
        var newPath = './public/uploads/'+fields.imgName+'/';
        var singleImg = imgArray[i];
        newPath+= singleImg.originalFilename;
        readAndWriteFile(singleImg, newPath);           
    }
    res.send("File uploaded to: " + newPath);

});

function readAndWriteFile(singleImg, newPath) {

        fs.readFile(singleImg.path , function(err,data) {
            fs.writeFile(newPath,data, function(err) {
                if (err) console.log('ERRRRRR!! :'+err);
                console.log('Fitxer: '+singleImg.originalFilename +' - '+ newPath);
            })
        })
}
})

assurez-vous que votre formulaire A enctype= "multipart / form-data"

j'espère que cela vous donne un coup de main ;)

0
répondu Despertaweb 2016-10-11 19:26:35