【问题标题】:Send PDF file from AngularJS to NodeJS将 PDF 文件从 AngularJS 发送到 NodeJS
【发布时间】:2014-08-24 10:04:16
【问题描述】:

我需要将一个 PDF 文件从 angularjs 客户端发送到 NodeJS 服务。 我做了 angularjs 服务,当我收到文件时,它是一个这样的字符串:

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

如何在 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;

 };

【问题讨论】:

  • 请显示您的客户端和服务器代码
  • 很多sendByEmails 有不同的论点...做不同的事情? BillService 是什么?
  • BillService 仅将文件和电子邮件作为字符串发送到我的 NodeJS 服务器,我在 sendByEmail(req...) 中收到了它,当我执行 req.body.file 时,我得到了第一个源示例,我输入了一个pdf,但我无法打开它,它已损坏

标签: node.js angularjs


【解决方案1】:

我不久前尝试过这个,我想出了这个。它还没有准备好生产,也许你觉得它很有用。它没有前端库(当然 Angular 除外),但假设您使用的是 Express 4x 和 body-parser。

结果:

在浏览器中:

在服务器上:

你所看到的:

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

您可以将其作为电子邮件附件发送,而不是保存到磁盘。例如,请参阅 herehere 了解相关信息。

下面的示例假设用户通过文件输入上传 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);
});

【讨论】:

  • 我在这个对象中有 PDF 文件:var resultPdf = pdf.output();。需要我做 angular-js 端代码吗?
  • 我有同样的错误,我只设置了服务器更改,fs.writefFile..etc。我试图打开pdf并给我一个错误。我正在使用快递 3
  • PDF 在我的设置下正确打开。你能确认数据是用 Base64 发送的吗?可以在 express 的 post 方法中写req.body 到控制台看到。
  • 我在 req.body.file 中找不到 data:application/pdf;base64 ...我应该在发送前将其转换为 base64 吗?
  • Base64 是你从reader.result 检索到它之后应该包含的内容。该字符串将以'data:application/pdf;base64, 开头。这是发送和保存的最有效方式。这也是电子邮件附件通常使用的内容。顺便说一下,我正在以 1.2 倍的角度进行此操作。
猜你喜欢
  • 2019-10-21
  • 2018-01-11
  • 2016-04-04
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 2021-12-27
  • 2020-04-13
相关资源
最近更新 更多