将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); });