2015-09-21 1 views
1

Existe-t-il un moyen de télécharger plusieurs pièces jointes vers Sendgrid avec Nodemailer/Express/Multer? Je suis en mesure d'envoyer un seul fichier, mais les tests approfondis avec un tableau de pièces jointes a échoué.Téléchargement de plusieurs fichiers avec nodemailer/sendgrid

C'est ma fonction de contrôleur où je soumets les fichiers:

$scope.submitEmail = function(email) { 

    var formData = new FormData(); 

    $scope.email.to = $scope.email_employer; 


    formData.append('from', $scope.email.from); 
    formData.append('to', $scope.email.to); 
    formData.append('subject', $scope.email.subject); 
    formData.append('text', $scope.email.text);   

    var fileSelect = document.getElementById('file-select'); 
    var files = fileSelect.files; 
    for (var i = 0; i < files.length; i++) { 
     var file = files[i]; 

     // Add the file to the request. 
     formData.append('attachment', file, file.name); 
    } 

    /* 
    Object.keys($scope.email).forEach(function(key) { 
     formData.append(key, $scope.email[key]); 
    }); 
    */ 

    $http.post('/api/email', formData, { 
     transformRequest: angular.identity, 
     headers: {'Content-Type': undefined} 
    }).then(function(data, status) { 

     console.log("Sent ok"); 

    }, function(data, status) { 

     //here we have to add an error message e.g. "We could not send the form at this moment. Try again later" 
     console.log(data); 
    }); 
}; 

Ceci est mon app.js où je tente d'envoyer le fichier à SendGrid

// Set default node environment to development 
process.env.NODE_ENV = process.env.NODE_ENV || 'development'; 

var express = require('express'); 
var config = require('./config/environment'); 
var http = require('http'); 
var bodyParser = require('body-parser'); 

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

var nodemailer = require('nodemailer'); 
var sgTransport = require('nodemailer-sendgrid-transport'); 

var options = { 
    auth: { 
    api_user: '##########', 
    api_key: '###########' 
} 
} 

var mailer = nodemailer.createTransport(sgTransport(options)); 


// Setup server 
var app = express(); 

var server = require('http').createServer(app); 
require('./config/express')(app); 
require('./routes')(app); 


app.post('/api/email', upload.array('attachment', 4), function(req, res, next)  { 

console.log(req.file); 

var mailOptions = { 
    to: req.body.to, 
    from: req.body.from, 
    subject: req.body.subject, 
    text: req.body.text, 
    attachments: [ 
     { 
      filename: req.file.originalname, 
      path: req.file.path 
     } 
    ] 
}; 

mailer.sendMail(mailOptions, function(err, res) { 
    if (err) { 
     console.log(err); 
    } 
    console.log(res); 
    }); 
}); 

// Start server 
server.listen(config.port, config.ip, function() { 
console.log('Express server listening on %d, in %s mode', config.port, app.get('env')); 
}); 

// Expose app 
exports = module.exports = app; 

L'erreur suivante est représenté:

TypeError: Cannot read property 'originalname' of undefined 
at /Applications/MAMP/htdocs/myproject/server/app.js:51:35 
at Layer.handle [as handle_request] (/Applications/MAMP/htdocs/myproject/node_modules/express/lib/router/layer.js:82:5) 
at next (/Applications/MAMP/htdocs/myproject/node_modules/express/lib/router/route.js:100:13) 
at done (/Applications/MAMP/htdocs/myproject/node_modules/multer/lib/make-middleware.js:36:7) 
at indicateDone (/Applications/MAMP/htdocs/myproject/node_modules/multer/lib/make-middleware.js:40:51) 
at /Applications/MAMP/htdocs/myproject/node_modules/multer/lib/make-middleware.js:142:11 
at WriteStream.<anonymous> (/Applications/MAMP/htdocs/myproject/node_modules/multer/storage/disk.js:43:9) 
at emitNone (events.js:72:20) 
at WriteStream.emit (events.js:166:7) 
at finishMaybe (_stream_writable.js:468:14) 
+0

coller votre code où vous utilisez upload.array ('attachement'). Ecrivez aussi ce qui a échoué lorsque vous testez plusieurs pièces jointes. s'il y a des erreurs dans la console, écrivez-les aussi. –

+0

J'ai mis à jour mon code. J'espère que c'est clair. Faites-moi savoir si vous avez besoin de plus d'informations –

Répondre

0

Merci pour la mise à jour. Maintenant, c'est clair pour moi. Votre erreur signifie que req.file n'est pas défini. Et c'est correct. Vérification des documents multiples https://github.com/expressjs/multer:

Si vous utilisez upload.single, les données de fichier se trouvent dans le fichier req. Mais lorsque vous utilisez upload.array, les données de vos fichiers se trouvent dans req.files (forme plurielle du fichier). Pour résoudre ce problème, remplacez le fichier req.file par req.files et souvenez-vous qu'il s'agit d'un tableau contenant des données de fichiers.

Par exemple orginalname du premier fichier est en req.files [0] .originalname

+0

Merci. Ça a marché! Je dois maintenant trouver un moyen d'itérer sur le tableau de fichiers et mettre la pièce jointe (s) dans les données Sendgrid. Avez-vous des idées pour y parvenir? C'est ce que j'ai jusqu'ici. 'var MailOptions = { à: req.body.to, de: req.body.from, sujet: req.body.subject, texte: req.body.text, pièces jointes: [{ nom de fichier: req.files [0] .originalname, chemin: req.files [0] .path } ] }; ' –

+0

Je suis heureux de pouvoir vous aider. J'ai écrit ci-dessous le code sans test juste de la tête (s'il vous plaît ne pas downvote s'il y a des erreurs): var attachementList = []; pour (var i = 0; i

+0

Quelques modifications mineures à votre code. Merci beaucoup! 'app.post ('/ api/email', upload.array ('pièce jointe', 4), fonction (req, res, next) {var attachementList = []; pour (var i = 0; i