我们可以将 PDF 文件从 AngularJS 客户端发送到 NodeJS 服务器吗

Can we send PDF file from AngularJS client to NodeJS server

使用 jspdf 我在客户端生成了 pdf 文件 (AngularJS)。我能够成功下载文件。现在我有另一个功能可以将 pdf via email 发送到用户电子邮件地址。

问题:

当用户点击 send email 按钮时,我使用 jspdf 创建的 pdf 应该上传到服务器,在那里我应该能够将从客户端获得的 pdf 文件附加到电子邮件.可以这样做吗?我不确定我们是否可以这样做。

我们可以将 var doc = new jsPDF('p', 'pt'); 中的 doc 对象发送到 nodejs 然后渲染它,最后附加到电子邮件吗?

如果无法完成上述任务,请告诉我其他可能性。

P.S: 我正在使用 nodemailer 发送电子邮件。

我已经为客户端和服务器端代码创建了一个示例代码,经过测试并且运行良好。请根据需要修改。

服务器端: 托管在 cloud9 上进行测试 - 因此它采用提供商通过 process 对象提供的 public ip 和端口。根据您的托管环境更改侦听器。

注意:请阅读内联评论以便更好地理解

var express = require('express');
var app = express();
var fs = require('fs');
var bodyParser = require('body-parser');
var formidable = require('formidable'),
form = new formidable.IncomingForm();

app.post("/", function(req, res, next) {
    form.parse(req, function(err, fields, files) {
        console.log("File received:\nName:"+files.pdf.name+"\ntype:"+files.pdf.type);
    });

    form.on('end', function() {
        /* this.openedFiles[0].path -- object Contains the path to the file uploaded
        ------- Use NodeMailer to process this file or attach to the mail-----------------*/
        console.log("PDF raw data:"+ fs.readFileSync(this.openedFiles[0].path, "utf8"));
        res.status(200).send("thank you");
    });
})
.listen(process.env.PORT, process.env.IP, function() {
    console.log('Server app listening');
});

客户端: Fiddler

注意: 我没有粘贴 imgData 因为 SO 有字符限制。请参考 fiddler link 获取客户端代码。将请求 URL 更改为您的服务器。客户端使用 Blob API,这是一个 HTML5 标准。所以在 HTML5 兼容的浏览器上测试它。

var imgData = [[**Copy the same image provided by JSpdf example. Check the fiddler for complete code**]]

var doc = new jsPDF();
doc.setFontSize(40);
doc.text(35, 25, "Octonyan loves jsPDF");
doc.addImage(imgData, 'JPEG', 15, 40, 180, 180);

var data = new Blob([doc.output()], {
    type: 'application/pdf'
});

var formData = new FormData();
formData.append("pdf", data, "myfile.pdf");
var request = new XMLHttpRequest();
request.open("POST", "https://saltjs-nirus.c9.io"); // Change to your server
request.send(formData);

参考文献: