如题,在node端将文件转化为文件流并通过pipe转给res后,前端按照查阅的资料,配置xhr,但是收到的response打印出来size为0;
node端get接口代码如下:
app.get('/api/download',function(req, res, next){
var currDir = path.join(__dirname,req.query.dir),
fileName = req.query.name,
currFile = path.join(currDir,fileName),
stats = fs.statSync(currFile);
fs.exists(currFile,function(exist) {
if(exist){
res.set({
"Content-type":"application/octet-stream",
"Content-Disposition":"attachment;filename="+encodeURI(fileName),
'Content-Length': stats.size
});
let fReadStream = fs.createReadStream(currFile);
fReadStream.pipe(res);
}else{
res.set("Content-type","text/html");
res.send("file not exist!");
res.end();
}
});
});
前端接收返回关键代码如下:
var xhr = new XMLHttpRequest();
xhr.open("get", '/api/download?dir='+response.data.dir+'&name='+response.data.fileName, true);
xhr.responseType = "blob";
xhr.onload = function() {
if (this.status == 200) {
var blob = this.response;
console.log(blob);
}};
xhr.send();
此时前端控制台打印出来的blob为
但是如果在node端将pipe注释掉,输入如下代码后,前端便能获得有size的blob。
//fReadStream.pipe(res);
res.send('testtesttesttest')
----------更新线----------
发现问题的一个更深层的表现,直接将拼接好的get方式的url输入浏览器可以直接下载,此时node端获得请求后文件流的size不为0,而通过上文写的xhr请求时,获取的node文件流size为0,也有仔细检查两者输入后获取的文件路径,并没有什么不同,所以就是请求的方式有问题了??
问题结束,自己结帖
首先这两段代码都没有问题,有人会问没有问题你说个鸡儿,报的错哪来的?
别急,应用场景是这样的,全是自己给自己挖的坑
至于是怎么实现最终的下载,很简单,前端模拟表单进行post请求数据下载,node端的post接口直接将请求到的文件流resFromJava.pipe.(resFromNode)。前端不需要做其他处理就可以出发浏览器的下载事件了。写到这里真的想爆锤自己