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