передача файла xlsx из nodejs в angular возвращает поврежденный файл - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть файл xlsx, сгенерированный из json. я могу сохранить файл на диске с nodejs и открыть его в Excel. Открывается правильно. Код ниже.

import { Request, Response } from "express";
// @ts-ignore
import json2xls from "json2xls";
import fs from "fs";

public async getActionXLS(req: Request, res: Response) {

   res.set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
   res.header("Content-Disposition", "attachment;filename=actions.xlsx");

   const fileContentJSON = {
        foo: 'bar',
        qux: 'moo',
        poo: 123,
        stux: new Date()
   };


   const xlsFileContent = json2xls(fileContentJSON);
   fs.writeFileSync('data.xlsx', xlsFileContent, 'binary');

   res.status(200).send(xlsFileContent);

}

Но если я отправлю файл в ответ на запрос angular, чем загрузить файл, он будет отображаться как поврежденный при открытии в Excel. Для получения документа вызывается метод get.

getActionXLS(project: Project) {
      this.http.get(this.urlCreator.getUrl(
        Paths.api.projects.actionsXLS, project.id), { responseType: "blob" }).subscribe(res => {
          downloadDocument({ name: `actions.xlsx`, doc: res });
        });
  }

export function downloadDocument({name, doc}) {
    const url = URL.createObjectURL(doc);
    const a = document.createElement("a");
    document.body.appendChild(a);
    a.setAttribute("style", "display: none");
    a.href = url;
    a.download = name;
    a.click();
    URL.revokeObjectURL(url);
    a.remove();
}

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

...