Загруженный PDF-файл поврежден

#node.js #file #express #vue.js

#node.js #файл #экспресс #vue.js

Вопрос:

Я пытаюсь отправить содержимое PDF-файла в качестве ответа в Express и во внешнем интерфейсе, хочу получить его и снова сохранить как pdf.

Вот мой экспресс-код.

 app.post('*', (req, res) => {

    ...

    fs.readFile(filePath , function (err,data){
      res.type('application/pdf')
      res.send(data)
    });
})
  

Путь к файлу — это полный путь к файлу pdf, и файл существует.

Во внешнем интерфейсе

 import fileDownload from 'js-file-download'

axios.post(process.env.API_ENDPOINT)
  .then(response => {
     fileDownload(response.data, 'reports.pdf', 'application/pdf;charset=utf-8')
  })
  

Загрузка работает, но загруженный PDF-файл поврежден.

Что здесь не так?

Комментарии:

1. Возможно, файл усекается? Совпадают ли размеры?

2. Размер становится немного меньше

3. Что произойдет, если вы запросите это непосредственно из браузера, без использования axios? Работает ли это? (измените post на get , чтобы вы могли протестировать маршрут напрямую)

4. Я уже имел дело с передачей pdf раньше и обнаружил, что самый надежный способ сделать это с помощью API (не полагаясь на внешнюю ссылку) — создать ссылку, которая передает объект в кодировке base46, подобный этому… el.href = window.URL.createObjectURL(b64toBlob(string, 'application/pdf'));

5. @MarcosCasagrande По некоторым причинам я не могу изменить его на get

Ответ №1:

Я нашел пример кода, который может сработать для вас.

Он не включает перевод base64, о котором я упоминал в комментариях, но это может быть необязательно и сэкономит вам некоторую работу над серверной частью. Я обнаружил, что у меня были некоторые проблемы, когда я пытался без него, но я не могу вспомнить, в чем это было.

 showFile(blob){
  // It is necessary to create a new blob object with mime-type explicitly set
  // otherwise only Chrome works like it should
  var newBlob = new Blob([blob], {type: "application/pdf"})

  // IE doesn't allow using a blob object directly as link href
  // instead it is necessary to use msSaveOrOpenBlob
  if (window.navigator amp;amp; window.navigator.msSaveOrOpenBlob) {
    window.navigator.msSaveOrOpenBlob(newBlob);
    return;
  } 

  // For other browsers: 
  // Create a link pointing to the ObjectURL containing the blob.
  const data = window.URL.createObjectURL(newBlob);
  var link = document.createElement('a');
  link.href = data;
  link.download="file.pdf";
  link.click();
  setTimeout(function(){
    // For Firefox it is necessary to delay revoking the ObjectURL
    window.URL.revokeObjectURL(data);
  , 100}
}

fetch([url to fetch], {[options setting custom http-headers]})
  .then(r => r.blob())
  .then(showFile)
  

источник:https://blog .jayway.com/2017/07/13/open-pdf-downloaded-api-javascript /