Как отправить файл из внешнего API на клиент без сохранения на сервере? - PullRequest
1 голос
/ 07 апреля 2019

Я пытаюсь сгенерировать PDF с помощью внешнего API, а затем вернуть этот PDF клиенту, не сохраняя его на сервере. Я знаю, что мне нужно использовать fs.createReadStream или pipe, но я не могу понять, как это реализовать. Я использую Express на бэкэнде и axios на веб-интерфейсе, хотя я счастлив использовать все, что работает. Это нужно только для Chrome, потому что это внутренний инструмент.

PDF возвращается и сохраняется должным образом с помощью CURL, но почему-то не сохраняет серверную часть, когда я использую JS API (в идеале, он не должен был бы сохранять, но это не имеет значения, пока он попадает к клиенту ). Я пробовал несколько вариантов pipe и readStream и writeStream, а также просто возвращал .pipe (res) из вызова API, и я могу получить пустой PDF для загрузки на стороне клиента, но он никогда не имеет данных.

Вот код для внешнего интерфейса:

  .then((response)=>{
    console.log('done', response)
    const url = window.URL.createObjectURL(new Blob([response.data]));
    const link = document.createElement('a');
    link.href = url;
    link.setAttribute('download', 'file.pdf');
    document.body.appendChild(link);
    link.click();
   })

И задняя часть:

app.post('/pdf', async (req, res) => {
  const data = req.body.data;
  res.writeHead(200, {
    "Content-Type": "application/octet-stream",
    "Content-Disposition": "attachment; filename=result.pdf"
  });

  await request.post('https://www.pdfotter.com/api/v1/pdf_templates/[templateID]/fill')
    .form(data)
    .auth([API KEY], '')
    .pipe(fs.createWriteStream('result.pdf'));

    const filePath =  __dirname + '/result.pdf';

    // Check if file specified by the filePath exists 
    fs.exists(filePath, (exists) => {
      if(exists) {     
        fs.createReadStream(filePath).pipe(res);
      } else {
        res.writeHead(400, {"Content-Type": "text/plain"});
        res.end("ERROR File does not exist");
      }
    });

  }

В идеале я хотел бы использовать API для создания PDF, а затем вернуть PDF клиенту (или передать PDF на Google Drive) без сохранения на сервере.

...