【发布时间】:2017-08-02 21:58:03
【问题描述】:
也许这个问题的措辞不是最好的,但这里有更多的上下文。使用 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);
};
后端:
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);
});
});
【问题讨论】:
-
如果要下载pdf,则需要进行如下设置。 Content-Type:application/octet-stream Content-Disposition:附件;文件名="file.pdf"
标签: javascript ajax node.js mongodb express