无法发送更多缓冲的数据流从node.js到客户端

无法发送更多缓冲的数据流从node.js到客户端

问题描述:

我使用GM,一个用于Node.js包的GraphicsMagick将图像转换为服务器上的pdf,并将它们发送给通过缓冲区的Angular.js像这样的流:无法发送更多缓冲的数据流从node.js到客户端

var comm = gm().command('convert') 
for (page in pages) { 
    comm.in('./docs/' + data.nomefile + '[' + pages[page] + ']') 
} 
comm.density(150, 150).compress('jpeg').stream('pdf', function(err, stdout, stderr) { 
      if (!err) { 
       var bufs = []; 
       stdout.on('data', function(chunk) { 
        bufs.push(chunk) 
       }); 
       stdout.on('end', function() { 
        var buf = Buffer.concat(bufs).toString('base64'); 
        res.header("Access-Control-Allow-Origin", "*"); 
        res.header("Access-Control-Allow-Headers", "X-Requested-With"); 
        res.header('content-type', 'application/pdf'); 
        res.send(buf) 
       }) 

不幸的是,我不能发送给客户更多的pdf页面(取决于它们的大小)。

在角我解码使用这项服务,这些图片:

$http.get(baseUrl+imageUrl, {responseType: 'arraybuffer'}). 
      success(function(data) { 
       var pdfData=Base64Service.ConvertArrayBuffer(data); 
       cbk(pdfData); 
      }). 

      error(function(data, status) { 
       var err= 'Request failed with status: ' + status; 
       cbk(err); 
      }); 

在控制器:

window.open('data:application/pdf;base64,' + pdfData); 

当超出限制我只得到一个空白页,而不是其他。

+1

建议:你应该能够简单地设置标题,然后在服务器端使用'stdout.pipe(res);'来避免缓冲。问题:为什么不直接在导航到远程端点的客户端上打开一个新窗口?这样你就不会遇到数据uri长度问题。 – mscdex

感谢mscdex的建议,这是我如何设法正确地呈现所有图像:

服务器端:

var comm = gm().command('convert') 
for (page in pages) { 
comm.in('./docs/' + data.nomefile + '[' + pages[page] + ']') 
} 
comm.density(150, 150).compress('jpeg').stream('pdf', function(err, stdout, stderr) { 
     if (!err) { 
      res.header('content-type', 'application/pdf'); 
      stdout.pipe(res) 
     } 

客户Angular.js服务:

createPdf: function(imageId, pagesArray) { 
$http({ 
     method: 'GET', 
     cache: false, 
     url: baseUrl + 'image/createPdf/', 
     params: { 
      id: imageId, 
      pages: JSON.stringify(pagesArray) 
     }, 
     responseType: "arraybuffer" 
    }).success(function(pdfData) { 
     var file = new Blob([pdfData], { type: 'application/pdf' }); 
     var fileURL = URL.createObjectURL(file); 
     window.open(fileURL); 
    }); 
}