Отправка вложений с помощью multer - PullRequest
0 голосов
/ 15 мая 2018

Обновление: То, что я пробовал до сих пор

app.post('/jobs/join-us', upload.array(), function (req, res, next) {
  console.log(req.body);
  res.json(req.body);
  var form = new formidable.IncomingForm();
  form.parse(req, function(err, fields, files) {
      // `file` is the name of the <input> field of type `file`
      var old_path = files.file.path,
          file_size = files.file.size,
          file_ext = files.file.name.split('.').pop(),
          index = old_path.lastIndexOf('/') + 1,
          file_name = old_path.substr(index),
          new_path = path.join(process.env.PWD, '/uploads/', file_name + '.' + file_ext);

      fs.readFile(old_path, function(err, data) {
          fs.writeFile(new_path, data, function(err) {
              fs.unlink(old_path, function(err) {
                  if (err) {
                      res.status(500);
                      res.json({'success': false});
                  } else {
                      res.status(200);
                      res.json({'success': true});
                  }
              });
          });
      });
  });

У меня есть контактная форма, где люди могут подать заявку на работу, для этого необходимо загрузить резюме на мой сайт.Как я могу отправлять вложения с помощью nodemailer и multer?Мой app.js для отправки электронных писем:

app.post('/jobs/join-us', upload.array(), function (req, res, next) {
  console.log(req.body);
  res.json(req.body);

  const output = `


      <p>You have a new message from contact form.</p>
      <h3>Contact Details</h3>
      <ul> 
        <li>Role: ${req.body.role}</li>
        <li>First name: ${req.body.first_name}</li>
        <li>Last name: ${req.body.last_name}</li>
        <li>Email: ${req.body.email}</li>
        <li>Phone: ${req.body.phone}</li>
        <li>Agreement: ${req.body.agreement}</li>
        <li>Referer: ${req.body.referer}</li>
        <li>CV: ${req.files}</li>

      </ul>
      <h3>Message</h3>
      <p>${req.body.description}</p>
    `;
  // create reusable transporter object using the default SMTP transport
  let transporter = nodemailer.createTransport({
    host: 'smtp.gmail.com',
    port: 587,
    secure: false, // true for 465, false for other ports
    auth: {
      user: 'xx', // generated ethereal user
      pass: 'xx',
    },
    tls: {
      rejectUnauthorized: false
    }
  });

Я также пытался добавить console.log (req.files) в app.post, но, похоже, он ничего не возвращает, может кто-нибудь предложить мне руководство?

1 Ответ

0 голосов
/ 15 мая 2018

Вы должны указать multer, какое имя поля отвечает за обработку загрузки файла, взгляните на следующий пример:

HTML:

<form action="/jobs/join-us" enctype="multipart/form-data" method="post">
    <input name="role" type="text">
    ...
    <input type="file" name="cv">
</form>

Express:

app.post('/jobs/join-us', upload.single('cv'), function (req, res, next) {
    ...
});

Примечание: если вы хотите загрузить только один файл, то предпочтительно использовать метод single(), array(), предназначенный для обработки загрузки нескольких файлов

NodeMailer:

Youсоздать объект транспорта, но вы забыли использовать его для отправки электронного письма с загруженным файлом во вложении:

transporter.sendMail({
    from: 'foo@example.com',    // sender
    to:   'bar@example.com',    // receiver
    subject: 'Contact Details', // Subject
    html: output,               // message body
    attachments: [
        {
            filename: req.file.originalname,
            path: req.file.path
        }
    ]
}, (error, info) => {
    if (error) {
        return console.log(error);
    }
})
...