#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 /