Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何解码节点js中的分块数据?_Node.js_Http - Fatal编程技术网

Node.js 如何解码节点js中的分块数据?

Node.js 如何解码节点js中的分块数据?,node.js,http,Node.js,Http,我从一个节点服务器接收到一个PDF文件(它在这个服务器上运行jsreport),我需要在客户端下载这个PDF(我在客户端使用react),但问题是,当我下载文件时,它是空的,标题是一些奇怪的符号。经过大量的测试和研究,我发现问题可能是文件被压缩成了块(我可以在响应的标题中看到这一点),我需要再次解码并成为一个文件 那么,如何再次将这个分块字符串解码为文件呢 在客户端中,我只是下载响应中的文件: handleGerarRelatorioButtonClick(){ axios.post(`

我从一个节点服务器接收到一个PDF文件(它在这个服务器上运行jsreport),我需要在客户端下载这个PDF(我在客户端使用react),但问题是,当我下载文件时,它是空的,标题是一些奇怪的符号。经过大量的测试和研究,我发现问题可能是文件被压缩成了块(我可以在响应的标题中看到这一点),我需要再次解码并成为一个文件

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

在客户端中,我只是下载响应中的文件:

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();
   });
app.post('/relatorios',(请求、响应)=>{
var exame=新exame(request.body);
var pdf=“”;
变量体={
“模板”:{
“shortid”:“S1C9birB-”,
“数据”:exame
}
};
变量选项={
主机名:“localhost”,
港口:5488,
路径:'/api/report',
方法:“POST”,
标题:{
“内容类型”:“应用程序/json”
}
};
var bodyparts=[];
var bodylength=0;
var post=http.request(选项,(res)=>{
res.on('数据',(块)=>{
身体部位。推(块);
bodylength+=chunk.length;
});
res.on('结束',()=>{
var pdf=新缓冲区(体长);
var-pdfPos=0;

对于(var i=0;i您的解决方案只是中继数据块,但您并没有告诉前端对这些数据块的期望值或如何组合它们。至少您应该将
内容类型
响应头设置为
应用程序/pdf
,并且要完成,还应该发送
内容处置
以及
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的文档,查看它在响应中发送的内容,您还可以阅读缓冲区


这是一段粗略的伪代码,但重点是在将标题设置为正确的值后使用PDF缓冲区进行响应。

好的,我现在就要尝试一下!只是想知道,我如何将PDF收集到缓冲区?你能给我一个示例代码吗?我通过post请求从jsreport获取PDF,我只知道这些我更改了代码t你知道我现在是如何从jsreport中获取pdf的。但仍然不起作用,我尝试了所有方法。我尝试将缓冲区转换为utf8字符串和base64字符串,但没有起作用。我不知道是怎么回事,互联网上甚至没有一个教程显示如何将pdf文件发送到客户端!!!至少没有使用node jsI不是在过去三天内尝试了所有内容,但没有成功。奇怪的是,pdf打开时页码正确,但没有显示任何内容,并且在标题中显示奇怪的符号。
var pdf=new Buffer(bodylength);
应该使用bodyparts,而不是bodylength,否?更不用说
新缓冲区
已被弃用,应该使用
Buffer.from([array])