将PDF文件从AngularJS发送到NodeJS

我需要从angularjs客户端发送PDF文件到NodeJS服务。 我做了angularjs服务,当我收到这个文件的string是这样的:

%PDF-1.3 3 0 obj <</Type /Page /Parent 1 0 R /Reso 

我怎样才能重新将此string转换为在NodeJS中的PDF?

这是客户端代码:

 var sendByEmail = function () { $scope.generatingPdf = true; $('#budget').show(); var pdf = new JsPDF('p', 'pt', 'letter'); var source = $('#budget')[0]; pdf.addHTML(source, 0, 0, function () { var resultPdf = pdf.output(); BillService.sendByEmail("rbrlnx@gmail.com", resultPdf).then(function () { }); $('#budget').hide(); }); }; var sendByEmail = function (email, file) { var deferred = $q.defer(); var data = { email: email, file: file }; BillService.sendByEmail(data, function (result) { deferred.resolve(result); }, function () { deferred.reject(); }); return deferred.promise; }; 

服务器代码控制器为空:

  var sendByEmail = function (req, res, next) { var file = req.body.file; }; 

我前段时间对此进行了尝试,并且提出了这个问题。 这远远不是生产准备,也许你觉得它有用。 它没有前端库(除了Angular of course),但假设你使用Express 4x和body-parser。

结果:

在浏览器中:

在这里输入图像描述

在服务器上:

在这里输入图像描述

你所看到的:

您正在看到一个小型的节点服务器,它提供静态的index.html和angular度文件,以及一个POST路由,它接收由HTML FileReader API提供的base64中的PDF,并将其保存到磁盘。

您可以将其作为电子邮件附件发送,而不是保存到磁盘。 在这里或这里查看一些信息。

下面的示例假定用户通过文件input上传PDF,但对于将文档发送到后端系统的所有其他方式,这个想法是相同的。 最重要的是发送PDF格式的数据作为BASE64,因为这是大多数文件编写者和电子邮件软件包使用的格式(而不是直接二进制例如..)。 这也适用于图像,文件等

我是怎么做到的:

在你的HTML中:

 <div pdfs>Your browser doesn't support File API.</div> 

一个叫做pdfs的指令:

 myApp.directive('pdfs', ['upload', function(upload) { return { replace: true, scope: function() { files = null; }, template: '<input id="files" type="file">', link: function(scope,element) { element.bind('change', function(evt) { scope.$apply(function() { scope.files = evt.target.files; }); }); }, controller: function($scope, $attrs) { $scope.$watch('files', function(files) { //upload.put(files) if(typeof files !== 'undefined' && files.length > 0) { for(var i = 0; i<files.length;i++) { readFile(files[i]) } } }, true); function readFile(file) { var reader = new FileReader(); reader.addEventListener("loadend", function(evt) { upload.post({name: file.name, data: reader.result}) }) if(reader.type = 'application/pdf') { reader.readAsDataURL(file); } } } } }]); 

一个小小的服务:

 myApp.service('upload', function($http) { this.post = function(file) { $http.post('/pdf', file); } }); 

和一个节点服务器:

 var express = require('express'); var bodyParser = require('body-parser') var fs = require("fs"); var app = express(); app.use(express.static('.')); app.use( bodyParser.json({limit: '1mb'}) ); app.post('/pdf', function(req, res){ var name = req.body.name; var pdf = req.body.data; var pdf = pdf.replace('data:application/pdf;base64,', ''); res.send('received'); fs.writeFile(name, pdf, 'base64', function(err) { console.log(err); }); }); var server = app.listen(3000, function() { console.log('Listening on port %d', server.address().port); });