【问题标题】:NodeJS:-How to store image from a form in mongo DB using multer and send the same image to mail as an attachmentNodeJS:-如何使用 multer 将表单中的图像存储在 mongo DB 中,并将相同的图像作为附件发送到邮件
【发布时间】:2022-02-05 03:11:08
【问题描述】:

我正在实施一个用户输入详细信息的网站。用户还可以选择在表单中附加图像/pdf(小于 5MB)。 我想将整个图像存储在我的 MongoDB 中,并使用节点 nodemailer 将图像发送到我的邮件帐户。

其他一切正常,我可以使用用户输入的详细信息发送邮件,但无法将图像保存在我的数据库中或将其发送到邮件帐户。

下面是我实现的代码

server.js:-

const express = require("express");
const multer = require('multer');
const path = require('path');
const app = express ();
app.set("view engine", "ejs");
const mongoose= require("mongoose");
const router = express.Router();
const nodemailer = require('nodemailer');
const smtpTransport = require('nodemailer-smtp-transport');

const User=require("./models/User");

// Multer image start
const storage = multer.diskStorage({
    destination: function(req, file, cb) {
      cb(null, './public/uploads/');
    },
    filename: function(req, file, cb) {
      cb(null, new Date().toISOString().replace(/:/g, '-') + file.originalname); //replace is used to save in computer readable format
    }
  });

const upload = multer({
    storage: storage,
    limits: {
      fileSize: 1024 * 1024 * 5
    }
});

mongoose.connect("mongodb://localhost/emergen");
var bodyParser = require('body-parser');

//Middleware
app.use(express.static(__dirname + '/public'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));


var uploadFile = upload.single('image');
app.post('/send', uploadFile, (req, res) => {

    var name = req.body.name;
    var email = req.body.email;
    var phone = req.body.phone;
    var message = req.body.message;
    var image = req.file.originalname;
    var newUser= {name:name,email:email,phone:phone,message:message,image:image};

    User.create(newUser,function(err,newCreatedUser){
        if(err){
            console.log(err);
        }
        else{
            console.log(newCreatedUser);
        }
    })

    // Mailer implementation
    var output = `
      <p>You have a new Contact Request from Emergen Website</p>
      <h3>Contact Details</h3>
      <ul>  
        <li>Name: ${req.body.name}</li>
        <li>Email: ${req.body.email}</li>
        <li>Phone: ${req.body.phone}</li>
        <li>Phone: ${req.file.path}</li>
      </ul>
      <h3>Message</h3>
      <p>${req.body.message}</p>
    `;
    // <h3>Attachment</h3>  Attachments if need to be added above in output
    // <p>${req.body.attachment}</p>

    var transporter = nodemailer.createTransport(smtpTransport({
        service: 'gmail',
        host: 'smtp.gmail.com',
        auth: {
          user: 'JackRogers@gmail.com',
          pass: '******'
        }, tls:{
            rejectUnauthorized:false  // remove when uploading on server
          }
      }));

      var mailOptions = {
        from: 'qwerty@gmail.com',
        to: 'asd@gmail.com',
        subject: 'New Enquiry for Emergen',
        text: 'That was easy!',
        html: output
      };

      transporter.sendMail(mailOptions, function(error, info){
        if (error) {
          console.log(error);
        } else {
          console.log('Email sent: ' + info.response);
        }
        res.redirect('/contact-us');
      }); 
});

我的模型,User.js:-

    const mongoose=require("mongoose");

    const UserSchema= new mongoose.Schema({
        name:String,
        email:String,
        phone:Number,
        message:String,
        image: { data: Buffer, contentType: String }
    });

module.exports= mongoose.model("User",UserSchema);

我的表格,contact-us.ejs:-

<form class="text-center border border-light p-5" method="POST" action="send" enctype="multipart/form-data">

                                <p class="h4 mb-4">Contact us</p>

                                <!-- Name -->
                                <input type="text" id="FormName" class="form-control mb-4" placeholder="Name" name="name" required>

                                <!-- Email -->
                                <input type="email" id="FormEmail" class="form-control mb-4" placeholder="E-mail" name="email" required>

                                <input type="text" id="FormContact" class="form-control mb-4" placeholder="Contact No" name="phone" required>

                                <!-- Message -->
                                <div class="form-group">
                                    <textarea class="form-control rounded-0" id="exampleFormControlTextarea2" rows="5" placeholder="Message" name="message" required></textarea>
                                </div>
                                <!-- Attachment -->
                                <div class="form-group">
                                    <label for="name">Document Upload:</label>
                                    <input type="file" class="form-control" id="image" name="image" >
                                </div>                            
                                <!-- Send button -->
                                <button class="btn btn-info btn-block" type="submit">Send</button>

                            </form>

请帮帮我。坚持一会儿

【问题讨论】:

    标签: javascript node.js mongodb mongoose nodemailer


    【解决方案1】:

    一种方法是:

    1. 将图像上传到您的服务器目录或某个文件托管站点。
    2. 从您的本地服务器或文件托管服务器获取图像的 url。
    3. 将该地址保存在您的数据库中。
    4. 将该地址用作图片来源。

    【讨论】:

    • 我正在将图像上传到名为 uploads 的目录中。那部分正在工作。如何使用存储在数据库中的地址通过 mail/nodemailer 即时发送图像
    • 你在本地服务器上吗?
    • 您可以使用本地开发,将文件作为附件作为电子邮件附件。要显示为作为电子邮件(HTM)一部分的图像,您必须具有可以使用互联网访问的图像 url。当图像在您的本地计算机上时,这是无法完成的。
    • @MuhammadFaizanUlHaq,您能否详细说明“非常糟糕的做法”?谢谢
    • @ddsultan 是的,这取决于用例,这个答案已经 2 岁了,所以我当时的知识。我现在将编辑答案。
    猜你喜欢
    • 1970-01-01
    • 2013-02-26
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 2019-04-30
    相关资源
    最近更新 更多