我正在接收來自節點服務器(它在此服務器上運行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打開正確的頁碼,但不顯示任何內容,它顯示標題中的奇怪符號.. –