我正在接收来自节点服务器(它在此服务器上运行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就好了。
好吧,我现在就试试吧!只是要知道,我如何收集PDF到缓冲区?你能给我一个示例代码吗?我从jsreport通过post请求获取pdf,这就是我所知道的 –
我更改了代码,以了解如何从jsreport获取pdf。但仍然没有工作,我试了一切..我试图将缓冲区转换为utf8字符串和base64字符串,但没有工作..我不知道什么是错的,甚至没有一个教程在互联网上显示如何发送pdf文件给客户端!!!至少不使用节点js –
我在过去的三天没有成功尝试一切。奇怪的是,PDF打开正确的页码,但不显示任何内容,它显示标题中的奇怪符号.. –