管道文件流的输出是什么?

时间:2017-03-12 23:02:38

标签: javascript ajax node.js mongodb express

也许这个问题没有以最好的方式措辞,但这里有更多的背景。使用GridFSBucket,我可以在mongo中存储文件并获取该文件的下载流。这是我的问题。假设我想将该文件作为对我的http请求的响应发回。

我做:

downloadStream.pipe(res);

在客户端,当我打印responseText时,我会得到一些带有一些看似加密的时髦字符的长字符串。这个字符串/流的格式/类型是什么?如何设置我的响应,以便我可以在客户端将流数据作为ArrayBuffer获取?

由于

更新:

我还没有解决问题,但是@Jekrb的建议提供了与执行console.log(this.responseText)完全相同的输出。看起来字符串不是缓冲区。以下是这两行的输出:

console.log(this.responseText.toString('utf8'))

var byteArray = new Uint8Array(arrayBuffer);

enter image description here

更新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);
});
});

3 个答案:

答案 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,而是使用responseresponse包含带有文件数据的arraybuffer。