2017-07-20 37 views
0

我正在接收来自节点服务器(它在此服务器上运行jsreport)的PDF文件,我需要在客户端下载此PDF(我正在使用客户端反应),但问题是当我下载文件,它全部是空白的,标题是一些奇怪的符号。经过大量的测试和研究后,我发现问题可能是文件被分块(我可以在响应的头部中看到),并且我需要解码才能再次成为文件。如何解码节点js中的分块数据?

那么,如何将这个分块字符串解码为一个文件呢?

在客户端我只是下载自带的responde文件:

handleGerarRelatorioButtonClick(){ 
    axios.post(`${REQUEST_URL}/relatorios`, this.state.selectedExam).then((response) => { 
     fileDownload(response.data, this.state.selectedExam.cliente.nome.replace(' ', '_') + ".pdf"); 
    }); 
    } 

在我的服务器,我做我的jsreport的请求是另一节点服务器,它返回的报告作为PDF:

app.post('/relatorios', (request, response) => { 
     var exame = new Exame(request.body); 
     var pdf = ''; 
     var body = { 
     "template": { 
      "shortid": "S1C9birB-", 
      "data": exame 
     } 
     }; 

     var options = { 
     hostname: 'localhost', 
     port: 5488, 
     path: '/api/report', 
     method: 'POST', 
     headers: { 
      'Content-Type': 'application/json' 
     } 
     }; 
     var bodyparts = []; 
     var bodylength = 0; 
     var post = http.request(options, (res) => { 
     res.on('data', (chunk) => { 
      bodyparts.push(chunk); 
      bodylength += chunk.length; 
     }); 

     res.on('end',() => { 
      var pdf = new Buffer(bodylength); 
      var pdfPos = 0; 
      for(var i=0;i<bodyparts.length;i++){ 
      bodyparts[i].copy(pdf, pdfPos, 0, bodyparts[i].length); 
      pdfPos += bodyparts[i].length; 
      } 
      response.setHeader('Content-Type', 'application/pdf'); 
      response.setHeader('Content-disposition', exame._id + '.pdf'); 
      response.setHeader('Content-Length', bodylength); 
      response.end(Buffer.from(pdf)); 
     }); 
     }); 

     post.write(JSON.stringify(body)); 
     post.end(); 
    }); 

我相信我的报告按预期呈现,因为如果我向邮递员发出请求,它会返回PDF就好了。

回答

0

您的解决方案是简单地中继数据块,但是您不会告诉您的前端该如何预期这些块或如何组装它们。至少您应该将Content-Type响应标题设置为application/pdf,并且完成后还应该发送Content-disposition以及Content-Length。如果您无法成功设置标题和管道响应,则可能需要从第三方源中收集PDF到缓冲区中,然后将该缓冲区发送到客户端。

- 我不熟悉jsreport,但它可能(也可能)他们发送的响应是缓冲区。如果是这样的话,你可以使用这样的事情发生在你的回应到客户端的:

myGetPDFFunction(params, (err, res) => { 
    if (err) { 
    //handle it 
    } else { 
    response.writeHead(200, { 
     'Content-Type': 'application/pdf', 
     'Content-Length': [your buffer's content length] 
    }); 
    response.end(Buffer.from([the res PDF buffer])); 
    } 
} 

什么你还没有表现出是由以获取PDF的要求,所以我不能更具体此时。您应该查看jsreport的文档以查看它在响应中发送的内容,并且还可以读取缓冲区中的内容here

这是粗略的伪代码,但重点是在将标头设置为他们的适当价值。

+0

好吧,我现在就试试吧!只是要知道,我如何收集PDF到缓冲区?你能给我一个示例代码吗?我从jsreport通过post请求获取pdf,这就是我所知道的 –

+0

我更改了代码,以了解如何从jsreport获取pdf。但仍然没有工作,我试了一切..我试图将缓冲区转换为utf8字符串和base64字符串,但没有工作..我不知道什么是错的,甚至没有一个教程在互联网上显示如何发送pdf文件给客户端!!!至少不使用节点js –

+0

我在过去的三天没有成功尝试一切。奇怪的是,PDF打开正确的页码,但不显示任何内容,它显示标题中的奇怪符号.. –