Создание файла из res.end (data, 'binary') приводит к повреждению файла - PullRequest
0 голосов
/ 30 октября 2018

В нашем приложении Excel создается с использованием модуля «Excel-Export» в одном API.

var nodeExcel = require('excel-export');
var result = nodeExcel.execute(conf);
res.setHeader('Content-Type', 'application/vnd.openxmlformates');
res.setHeader("Content-Disposition",    "attachment;filename="+ "abcd.xlsx");
res.end(result, 'binary');

Я использую этот API в другом API, где этот файл Excel должен быть отправлен по почте в виде вложения. Мы используем REST API Sendgrid v3 для отправки почты.

var file = fs.createWriteStream('abc.xlsx');
var options1 = { method: 'GET',
        url: <api url>,
        encoding: 'binary'
        };    
request(options1, function (error, response, body) {
    if (error) throw new Error(error);    
    response.pipe(file);        
    var avi = JSON.stringify(file);
    var buff = new Buffer.from(avi).toString('base64');
    var options = { method: 'POST',
                url: 'https://api.sendgrid.com/v3/mail/send',
                headers:
                    { 'content-type': 'application/json',
                      'authorization': <####> },
                body:
                    { personalizations:
                        [ { to: <####>,
                        subject: <#####> ],
                        from: <####>,
                        content: <####>,
                        attachments: [ { content: buff, filename: 'abc.xlsx' } ] },
                        json: true };
request(options, function (error, response, body) {
  if (error) throw new Error(error);
  console.log(body);
});
});

Письмо отправляется, но когда я пытаюсь открыть Excel, выдается ошибка, что файл поврежден. Куда я иду не так?

1 Ответ

0 голосов
/ 30 октября 2018

Я решил проблему. Хитрость заключалась в том, чтобы использовать encoding: null вместо encoding: 'binary'. Также вместо

response.pipe(file);        
var avi = JSON.stringify(file);
var buff = new Buffer.from(avi).toString('base64');

Я использовал

var buff = new Buffer.from(body).toString('base64');
...