-
Notifications
You must be signed in to change notification settings - Fork 58
/
Copy pathfile-saver.js
55 lines (46 loc) · 1.62 KB
/
file-saver.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import Service from '@ember/service';
export default class FileSaverService extends Service {
async save({
url,
token,
fetcher = _fetchData,
downloadFileForIEBrowser = _downloadFileForIEBrowser,
downloadFileForModernBrowsers = _downloadFileForModernBrowsers,
}) {
const response = await fetcher({ url, token });
if (response.status !== 200) {
const jsonResponse = await response.json();
throw jsonResponse.errors;
}
const fileName = _getFileNameFromHeader(response.headers);
const fileContent = await response.blob();
const browserIsInternetExplorer = window.document.documentMode;
browserIsInternetExplorer
? downloadFileForIEBrowser({ fileContent, fileName })
: downloadFileForModernBrowsers({ fileContent, fileName });
}
}
function _fetchData({ url, token }) {
return fetch(url, {
headers: { Authorization: `Bearer ${token}` },
});
}
function _getFileNameFromHeader(headers) {
if (headers && headers.get('Content-Disposition')) {
const contentDispositionHeader = headers.get('Content-Disposition');
const [, fileName] = /filename\*?=['"]?([^;\r\n"']*)['"]?/.exec(contentDispositionHeader);
return fileName;
}
}
function _downloadFileForIEBrowser({ fileContent, fileName }) {
window.navigator.msSaveOrOpenBlob(fileContent, fileName);
}
function _downloadFileForModernBrowsers({ fileContent, fileName }) {
const link = document.createElement('a');
link.style.display = 'none';
link.href = URL.createObjectURL(fileContent);
link.download = fileName;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}