2017-08-25 3 views
0

J'ai une application MEAN stack et je tente de télécharger un fichier avec multer. Le téléchargement fonctionne bien le seul problème est que je veux retourner l'ID du fichier téléchargé.Comment retourner l'identifiant du fichier téléchargé (upload avec multer dans l'application nodejs express)

//multer settings for single upload 
var upload = multer({ storage: storage }).single('file'); 

app.post('/upload', upload, function (req, res) { 
//// ????? What to return and how? 
}); 

Je suis abonné à ce message en service angular2. Merci de votre aide.

+0

@rckrd cela fonctionne De cette façon aussi, je le passe comme second param en post. – 1011sophie

+0

Mais de toute façon si je l'appelle à l'intérieur du poste comme celui-ci: app.post ('/ upload', fonction (req, res) { upload (req, res, fonction (err) { if (err) { res.json ({code_erreur: 1, err_desc: erreur}); return; } console.log (res); }); }); dans la console je vois grand objet qui contient aussi objet de fichier et il a 'id' qui est ce que je veux renvoyer – 1011sophie

Répondre

1
var multer = require('multer'); 

// storage for upload file. 
var storage = multer.diskStorage({ 
    destination: function (req, file, callback) { 
    callback(null, './file'); 
    }, 
    filename: function (req, file, callback) { 
    callback(null, file.originalname); 
    } 
}); 

var Upload = multer({ 
    storage: storage 
}).any('file'); 


router.post('/upload', postData); 

function postData(req, res) { 
Upload(req, res, function (error) { 
    if (error) { 
     res.status(400).send(error); 
    } 
    var obj = {}; 
    obj.file = req.files.filename; 
    //file is getting stored into database and after it successfully stored 
    //into database it will return you Id 
    db.create(obj, function (err, data) { 
         if (err) { 
          res.send('error'); 
         } 
         if (!data) { 
          res.send('Error'); 
         } else { 
          console.log('file upload'); 
          res.send(data._id); 
         } 
        }); 
      }); 
     } 

pour revenir Id vous devriez avoir à stocker référence quelque part dans la base de données et après que vous retournerez id Angular2

0

L'objet fichier de requête (req.file) ne contient pas d'identifiant unique, vous devra rouler votre propre identité assignant la logique.

Vous devrez penser dans quel but vous avez besoin de cet ID, alors vous pouvez utiliser les informations stockées dans l'objet fichier de demande (req.file) pour le rendre spécifique à ce fichier. Par exemple, si tous les fichiers sont stockés dans le même chemin, et que l'ID sera utilisé pour récupérer ce fichier plus tard, alors vous devez penser à une stratégie qui ne vous donnera pas de problèmes avec l'entrée de l'utilisateur.


Chaque fichier téléchargé avec multer contient les informations suivantes:

**:Key:**  **:Description:** 

fieldname  Field name specified in the form  
originalname Name of the file on the user's computer  
encoding  Encoding type of the file 
mimetype  Mime type of the file 
size   Size of the file in bytes 
destination  The folder to which the file has been saved (DiskStorage only) 
filename  The name of the file within the destination (DiskStorage only) 
path   The full path to the uploaded file   (DiskStorage only) 
buffer   A Buffer of the entire file     (MemoryStorage only) 

, vous pouvez utiliser le nom du fichier (utilisé sous la forme) req.file.fieldname.

Ou le fichier d'origine req.file.originalname (mais en utilisant originalname ne peut créer des problèmes si vous téléchargez le même nom multipletime, alors ...)

Mieux encore, créer une chaîne unique pour le fichier en combinant un horodatage de date avec le filename/original comme: timestamp-filename.ext

Ou générer un hachage aléatoire (par exemple en utilisant la chaîne timestamp-filename.ext) 5910c2f5df0471320b8fc179fa6dc1114c1425752b04127644617a26a373694a (SHA256)

+0

dans la res de la fonction de téléchargement existe existe id, aussi je vois cet Id dans la table DB .. Le problème est je ne peux pas le retourner. – 1011sophie

0

Si vous utilisez Mongo DB (GridFS-stream) pour stocker le fichier de l'objet res de la fonction de transfert a pour objet sous res.req.file qui a tous les détails avec les informations de métadonnées et de grille du fichier téléchargé comme ci-dessous:

{ 
    fieldname:'file', 
    originalname:'Screenshot (1).png', 
    encoding:'7bit', 
    mimetype:'image/png', 
    filename:'file-1516342158216.png', 
    metadata:{ 
     originalname:'Screenshot (1).png', 
     email:'[email protected]', 
     imageType:'ProfilePic' 
    }, 
    id:5 a618b8e1d9af11f388dcabb, 
    grid:{ 
     _id:5  a618b8e1d9af11f388dcabb, 
     filename:'file-1516342158216.png', 
     contentType:'image/png', 
     length:675410, 
     chunkSize:261120, 
     uploadDate:2018-01  -19  T06:09:18.736  Z, 
     aliases:undefined, 
     metadata:{ 
     originalname:'Screenshot (1).png', 
     email:'[email protected]', 
     imageType:'ProfilePic' 
     }, 
     md5:'fdda12a2f098a915c24162dc410cb3b6' 
    }, 
    size:undefined 
}