获取所选文件的路径 ( <input type="file"...> )

Get the path of selected file ( <input type="file"...> )

在我的应用程序中有一个用于上传简历的输入字段。



我需要做的是在文件 selected 后,将该 CV (pdf) 作为附件通过电子邮件发送给用户。 为此,我使用 Sendgrid。在 sendgrid 中,我们必须像下面这样安排电子邮件选项。

const fs = require('fs');

pathToAttachment = `file_path`;
attachment = fs.readFileSync(pathToAttachment).toString('base64');

const email = {
  ...
  attachments: [
    {
      content: attachment,
      filename: 'file_name',
      type: 'application/pdf',
      disposition: 'attachment'
    }
  ]
 ...}

所以这里需要插入一个文件路径来将pdf附加到电子邮件中。我使用 Bootstrap 作为输入字段。所以我需要知道,如何插入 selected 文件的路径。目前我只能使用事件获取 select 文件。


pdfFile = event.target.files[0];

在示例代码中,附件是从文件系统加载的,但是在这种情况下,附件是通过带有文件输入的 Web 表单输入的。所以,你不需要从文件系统中获取文件,而是从表单提交中处理它。

当您提交带有附件的表单时,附件会在提交表单时发送到您的服务器。附件通常以 multipart/form-data 格式发送。从您的代码示例来看,您似乎正在使用 Node.js,因此我还假设您的服务器是 Express 服务器。有很多方法可以解析传入的多部分请求,一种选择是 multer。要使用 multer 接收您上传的文件,然后将其传递给 SendGrid,将如下所示:

const express = require('express');
const app = express();
const multer  = require('multer');
const memoryStore = multer.memoryStorage();
const upload = multer({ storage: memoryStore });

app.post('/profile', upload.single("cv"), async function (req, res, next) {
  // req.file is the "cv" file
  const email = {
    from: FROM,
    to: TO,
    text: "This has an attachment",
    attachments: [
      {
        content: req.file.buffer.toString("base64"),
        filename: "cv.pdf",
        type: "application/pdf",
        disposition: "attachment",
      }
    ]
  };
  await sg.mail(email);
  res.send("OK");
})

我为这个文件选择了内存存储,因为它不一定需要写入磁盘。不过,您可能也想将文件写入磁盘,为此使用内存还有其他注意事项。

因为文件在内存中,req.file 有一个描述文件的对象和一个包含内容的 buffer 属性。 SendGrid 需要您对附件进行 base64 编码,因此我们调用 req.file.buffer.toString("base64").

这是一个简单的示例,我建议您阅读 the documentation for multer 以了解上传的工作原理以及如何将其应用于发送电子邮件附件。