也许这个问题没有以最好的方式措辞,但这里有更多的背景。使用GridFSBucket,我可以在mongo中存储文件并获取该文件的下载流。这是我的问题。假设我想将该文件作为对我的http请求的响应发回。
我做:
downloadStream.pipe(res);
在客户端,当我打印responseText时,我会得到一些带有一些看似加密的时髦字符的长字符串。这个字符串/流的格式/类型是什么?如何设置我的响应,以便我可以在客户端将流数据作为ArrayBuffer获取?
由于
更新:
我还没有解决问题,但是@Jekrb的建议提供了与执行console.log(this.responseText)
完全相同的输出。看起来字符串不是缓冲区。以下是这两行的输出:
console.log(this.responseText.toString('utf8'))
var byteArray = new Uint8Array(arrayBuffer);
更新2 - 代码链接
前端:
var savePDF = function(blob){
//fs.writeFile("test.pdf",blob);
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (this.readyState === XMLHttpRequest.DONE && this.status === 200){
//TO DO: Handle the file in the response which we will be displayed.
console.log(this.responseText.toString('utf8'));
var arrayBuffer = this.responseText;
if (arrayBuffer) {
var byteArray = new Uint8Array(arrayBuffer);
}
console.log(arrayBuffer);
}
};
xhr.open("POST","/pdf",true);
xhr.responseType = 'arrayBuffer';
xhr.send(blob);
};
BACKEND:
app.post('/pdf',function(req,res){
MongoClient.connect("mongodb://localhost:27017/test", function(err, db) {
if(err) return console.dir(err);
console.log("Connected to Database");
var bucket = new GridFSBucket(db, { bucketName: 'pdfs' });
var CHUNKS_COLL = 'pdfs.chunks';
var FILES_COLL = 'pdfs.files';
// insert file
var uploadStream = bucket.openUploadStream('test.pdf');
var id = uploadStream.id;
uploadStream.once('finish', function() {
console.log("upload finished!")
var downloadStream = bucket.openDownloadStream(id);
downloadStream.pipe(res);
});
// This pipes the POST data to the file
req.pipe(uploadStream);
});
});
答案 0 :(得分:1)
我的猜测是,响应是以普通二进制形式输出的,它不是base64编码的(仍然是缓冲区),或者它是一个需要首先解压缩的压缩(gzip)响应。
虽然没有看到代码但很难确定问题。
更新:
您似乎错过了正确的回复标题。
尝试在downloadStream.pipe(res)
:
res.setHeader('Content-disposition', 'attachment; filename=test.pdf');
res.set('Content-Type', 'application/pdf');
答案 1 :(得分:0)
您的信息流可能已经是一个缓冲区了。您可以调用responseText.toString('utf8')
将流数据转换为可读字符串。
答案 2 :(得分:0)
我解决了!!!
基本上将响应类型预设为" arraybuffer"在您使用之前提出请求
req.responseType = "arraybuffer"
现在,收到回复后,请不要使用responseText
,而是使用response
。 response
包含带有文件数据的arraybuffer。