将API生成的PDF发送到外部服务器?

时间:2018-01-10 16:03:10

标签: python node.js django express pdf

我有一个NodeJS-ExpressJS服务器(用于托管网页)和Django API服务器。当从ExpressJS服务器调用Django服务器中的特定端点时(当用户单击网页上的按钮时),将生成PDF。我想将这个PDF从Django服务器发送到ExpressJS服务器,然后将其下载到用户的浏览器(用户只与ExpressJS服务器接口)。为此,我将PDF编码为Django服务器中的base64字符串,并在HTTP响应中返回该字符串。在ExpressJS服务器中,我解码base64字符串,然后使用ExpressJS框架提供的res.download()方法将PDF下载到用户的浏览器。这种方法似乎有效,但它可以破坏PDF文件吗?有没有办法简单地将PDF文件作为二进制文件发送并以这种方式下载到浏览器(如果可能,请提供示例)?非常感谢任何答案,示例和建议。

Django API server
def process_upload(request):
   '''
   Process request and generate PDF
   ....
   '''
   with open(pdf, "rb") as pdf_file:
     encoded_string = base64.b64encode(pdf_file.read())
     return HttpResponse(encoded_string)

ExpressJS server
server.get('/api', function(req, res, next) {
  request.post({
     url: 'http://<api_url>',
     oauth: oauth,
     preambleCRLF: true,
     postambleCRLF: true
   }, function(error, response, body){
      res.writeHead(200, {
        'Content-Type': 'application/pdf',
        'Content-Disposition': 'attachment; filename="file.pdf"' 
      });
   });
   const download = Buffer.from(body.toString('utf-8'), 'base64');
   res.end(download);
 });  

1 个答案:

答案 0 :(得分:1)

我认为你的代码很庞大并且在将结果写回客户端之前将每个请求的整个file.pdf缓冲到内存(body)中,如果有的话,它可能会开始占用大量内存同时有很多请求,这就是你应该使用流的原因:

server.get('/apisd', function(req, res, next) {

    // Force browser to download file
    res.set('Content-Type', 'application/pdf');
    res.set('Content-Disposition', 'attachment; filename=file.pdf');

    // send file
    request.post({
        url: 'http://<api_url>',
        oauth: oauth,
        preambleCRLF: true,
        postambleCRLF: true
    }).pipe(res);

});

通过使用流程,程序将一次读取file.pdf一个块,将其存储到内存中并将其发送回客户端。