使用AngularJS和NodeJS发送图像

时间:2016-08-26 19:49:56

标签: image-uploading nodemailer ng-file-upload

您好我正在为用户发送图片服务'信息。例如,名称,电话号码及其要上传的图像。

我打算使用AngularJS自定义依赖项之一ng-file-upload。然后,我将使用Nodemailer将所有信息和图像发送到其他地方。

但我的问题是我可以发送其他文本数据和ng-file-upload吗?第二是我可以通过nodemailer发送带有其他文本数据的图像吗?

2 个答案:

答案 0 :(得分:1)

您肯定可以使用nodemailer将图像作为附件发送。

尝试将此图片作为附件发送:

var mailOptions = {
    ...
    html: 'Embedded image: <img src="cid:unique@kreata.ee"/>',
    attachments: [{
        filename: 'image.png',
        path: '/path/to/file',
        cid: 'unique@kreata.ee' //same cid value as in the html img src
    }]
}

有关将图像作为附件发送的更多参考,请参阅nodemailer's "using Embedded documentation"

问题的第一部分:

是的!您可以使用ng-file-upload将其他文本数据与图像一起发送。这取决于你想要做什么以及你想要达到的目标。

例如,请参阅以下代码:

HTML模板

<form name="form">
    <input type="text" ng-model="name" ng-required="true">
    <input type="text" ng-model="phoneNo" ng-required="true">
    <div class="button" ngf-select ng-model="file" name="file" ngf-pattern="'image/*'" ngf-accept="'image/*'" ngf-max-size="20MB" ngf-min-height="100" ngf-resize="{width: 100, height: 100}">Select</div>
    <button type="submit" ng-click="submit()">submit</button>
</form>

<强>控制器

$scope.submit = function() {
  if ($scope.form.file.$valid && $scope.file) {
    $scope.upload($scope.file);
  }
};

// upload on file select or drop
$scope.upload = function (file) {
    Upload.upload({
        url: 'upload/url',
        data: {file: file, 'name': $scope.name, 'phoneNo' : $scope.phoneNo}
    }).then(function (resp) {
        console.log('Success ' + resp.config.data.file.name + 'uploaded. Response: ' + resp.data);
    }, function (resp) {
        console.log('Error status: ' + resp.status);
    }, function (evt) {
        var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
        console.log('progress: ' + progressPercentage + '% ' + evt.config.data.file.name);
    });
};

完全阅读ng-file-upload documentation,了解您可以执行的所有操作以及文件上传。它有很多例子可以让你理解一切。

我希望它有所帮助,并回答你的问题。

答案 1 :(得分:1)

虽然OP最终找到了一个解决方案,但由于我遇到了同样的问题,我认为我会在这里发布整个代码给其他可能会遇到困难的人。

以下是我将ng-file-uploadnodemailer合并后使用Gmail通过电子邮件上传和发送附件的方式:

HTML表单:

<form name="postForm" ng-submit="postArt()">
...
<input type="file" ngf-select ng-model="picFile" name="file" ngf-max-size="20MB">
...
</form>

<强>控制器:

app.controller('ArtCtrl', ['$scope', 'Upload', function ($scope, Upload) {
    $scope.postArt = function() {
        var file = $scope.picFile;
        console.log(file);
        file.upload = Upload.upload({
            url: '/api/newart/',
            data: {
                username: $scope.username,
                email: $scope.email,
                comment: $scope.comment,
                file: file
            }
        });
    }
}]);

服务器

var nodemailer = require('nodemailer');
var multipartyMiddleware = require('connect-multiparty')();
// multiparty is required to be able to access req.body.files !

app.mailTransporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
        user: ...
        pass: ...
    },
    tls: { rejectUnauthorized: false } // needed or Gmail might block your mails
});

app.post('/api/newart', multipartyMiddleware,function(req,res){
    console.log(req.files);
    mailOptions = {
        from: req.body.email,
        to: ...,
        subject: ...
        text: ...,
        attachments: [{
            filename: req.files.file.name,
            path: req.files.file.path // 'path' will stream from the corresponding path
        }]
    };
    app.mailTransporter.sendMail(mailOptions, function(err) {
        if (err) {
            console.log(err);
            res.status(500).end();
        }
        console.log('Mail sent successfully');
        res.status(200).end()
    });
});

nodemailer examples让我明白了这一点!

这适用于任何文件类型。有些人可能错过的关键方面是您需要多方访问上传的文件(在req.body.files中)。然后,最方便的方法是使用附件对象中的path键。