无法发送更多缓冲的数据流从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);
当超出限制我只得到一个空白页,而不是其他。
答
感谢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);
});
}
建议:你应该能够简单地设置标题,然后在服务器端使用'stdout.pipe(res);'来避免缓冲。问题:为什么不直接在导航到远程端点的客户端上打开一个新窗口?这样你就不会遇到数据uri长度问题。 – mscdex