Skip to content

Instantly share code, notes, and snippets.

@joshxyzhimself
Forked from devloco/download-pdf.js
Created July 29, 2020 04:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save joshxyzhimself/527f901a4a632dc2497db4caeb36a530 to your computer and use it in GitHub Desktop.
Save joshxyzhimself/527f901a4a632dc2497db4caeb36a530 to your computer and use it in GitHub Desktop.
Download a PDF via POST with Fetch API
let fnGetFileNameFromContentDispostionHeader = function (header) {
let contentDispostion = header.split(';');
const fileNameToken = `filename*=UTF-8''`;
let fileName = 'downloaded.pdf';
for (let thisValue of contentDispostion) {
if (thisValue.trim().indexOf(fileNameToken) === 0) {
fileName = decodeURIComponent(thisValue.trim().replace(fileNameToken, ''));
break;
}
}
return fileName;
};
let postInfo = {
id: 0,
name: 'foo'
};
let headers = new Headers();
headers.append('Content-Type', 'application/json');
fetch(`api/GetPdf`, {
method: 'POST',
headers: headers,
body: JSON.stringify(postInfo)
})
.then(async res => ({
filename: fnGetFileNameFromContentDispostionHeader(res.headers.get('content-disposition')),
blob: await res.blob()
}))
.then(resObj => {
// It is necessary to create a new blob object with mime-type explicitly set for all browsers except Chrome, but it works for Chrome too.
const newBlob = new Blob([resObj.blob], { type: 'application/pdf' });
// MS Edge and IE don't allow using a blob object directly as link href, instead it is necessary to use msSaveOrOpenBlob
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveOrOpenBlob(newBlob);
} else {
// For other browsers: create a link pointing to the ObjectURL containing the blob.
const objUrl = window.URL.createObjectURL(newBlob);
let link = document.createElement('a');
link.href = objUrl;
link.download = resObj.filename;
link.click();
// For Firefox it is necessary to delay revoking the ObjectURL.
setTimeout(() => { window.URL.revokeObjectURL(objUrl); }, 250);
}
})
.catch((error) => {
console.log('DOWNLOAD ERROR', error);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment