From f8e3013b594103b2b6914d875e208481591d3145 Mon Sep 17 00:00:00 2001 From: Suman Bhattarai Date: Thu, 3 Oct 2019 04:47:30 -0600 Subject: [PATCH] fix: tarball download not working on Firefox and Edge (#144) * fix tarball download not working on firefox and edge * update lastModified to be a date number --- src/utils/url.ts | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/utils/url.ts b/src/utils/url.ts index 6d63cc7..59959ed 100644 --- a/src/utils/url.ts +++ b/src/utils/url.ts @@ -23,15 +23,37 @@ export function extractFileName(url: string): string { return url.substring(url.lastIndexOf('/') + 1); } +function blobToFile(blob: Blob, fileName: string): File { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const b: any = blob; + b.lastModified = Date.now(); + b.name = fileName; + return b as File; +} + export function downloadFile(fileStream: Blob, fileName: string): void { - const file = new File([fileStream], fileName, { type: 'application/octet-stream', lastModified: Date.now() }); + let file: File; + // File constructor is not supported by Edge + // https://developer.mozilla.org/en-US/docs/Web/API/File#Browser_compatibility + if (navigator.msSaveBlob) { + // Detect if Edge + file = blobToFile(new Blob([fileStream], { type: 'application/octet-stream' }), fileName); + } else { + file = new File([fileStream], fileName, { type: 'application/octet-stream', lastModified: Date.now() }); + } + const objectURL = URL.createObjectURL(file); const fileLink = document.createElement('a'); fileLink.href = objectURL; fileLink.download = fileName; + + // Without appending to an HTML Element, download dialog does not show up on Firefox + // https://github.com/verdaccio/ui/issues/119 + document.documentElement.appendChild(fileLink); fileLink.click(); // firefox requires remove the object url setTimeout(() => { URL.revokeObjectURL(objectURL); + document.documentElement.removeChild(fileLink); }, 150); }