2017-07-20 64 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打開正確的頁碼,但不顯示任何內容,它顯示標題中的奇怪符號.. –