2015-09-21 6 views
1

Есть ли способ загрузить несколько вложений в Sendgrid с помощью Nodemailer/Express/Multer? Я могу отправить один файл, но тщательное тестирование с массивом вложений не получилось.Загрузка нескольких файлов с помощью nodemailer/sendgrid

Это моя функция контроллера, где я отправить файлы:

$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); 
    }); 
}; 

Это мой app.js, где я пытаюсь отправить файл 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; 

Следующая ошибка показано:

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

вставить код, где вы используете upload.array ('вложение'). Напишите также, что не удалось, когда вы тестируете несколько подключений. если в консоли есть ошибки, тогда пишите их тоже. –

+0

Я обновляю свой код. Надеюсь, это ясно. Дайте мне знать, если вам нужно больше информации –

ответ

0

Благодарим за обновление. Теперь это ясно для меня. Ваша ошибка означает, что req.file не определен. И это правильно. Проверить multer docs https://github.com/expressjs/multer:

если вы используете upload.single, то данные файла находятся в файле req.file. Но когда вы используете upload.array, ваши данные файлов находятся в req.files (множественная форма файла).

Чтобы устранить эту проблему, измените код req.file на req.files и помните, что это массив с данными файлов.

Например orginalname первого файла в req.files [0] .originalname

+0

Спасибо. Это сработало! Теперь я должен найти способ итерации по массиву файлов и поместить вложенные файлы (s) в данные Sendgrid. Есть ли у вас какие-либо идеи, как достичь этого? Это то, что я до сих пор. 'вар mailOptions = { к: req.body.to, от: req.body.from, Заголовок: req.body.subject, текст: req.body.text, вложения: [ { имя файла: req.files [0] .originalname, путь: req.files [0] .path } ] }; ' –

+0

Я рад, что смогу помочь. Я написал ниже код без теста только с головы (пожалуйста, не уменьшайте, если есть ошибки): var attachementList = []; для (var i = 0; i

+0

Некоторые незначительные изменения в вашем коде. Большое спасибо! 'app.post ('/ api/email', upload.array ('attachment', 4), function (req, res, next) {var attachementList = []; for (var i = 0; i