2016-03-07 3 views
0

Я использую GM, пакет GraphicsMagick для Node.js для преобразования изображений в 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

ответ

0

Благодаря 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); 
    }); 
} 
Смежные вопросы