DownloadURL.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /* *
  2. *
  3. * (c) 2015-2021 Oystein Moseng
  4. *
  5. * License: www.highcharts.com/license
  6. *
  7. * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
  8. *
  9. * Mixin for downloading content in the browser
  10. *
  11. * */
  12. 'use strict';
  13. import Highcharts from '../Core/Globals.js';
  14. var win = Highcharts.win, doc = win.document, domurl = win.URL || win.webkitURL || win;
  15. /**
  16. * Convert base64 dataURL to Blob if supported, otherwise returns undefined.
  17. * @private
  18. * @function Highcharts.dataURLtoBlob
  19. * @param {string} dataURL
  20. * URL to convert
  21. * @return {string|undefined}
  22. * Blob
  23. */
  24. var dataURLtoBlob = Highcharts.dataURLtoBlob = function (dataURL) {
  25. var parts = dataURL
  26. .replace(/filename=.*;/, '')
  27. .match(/data:([^;]*)(;base64)?,([0-9A-Za-z+/]+)/);
  28. if (parts &&
  29. parts.length > 3 &&
  30. win.atob &&
  31. win.ArrayBuffer &&
  32. win.Uint8Array &&
  33. win.Blob &&
  34. domurl.createObjectURL) {
  35. // Try to convert data URL to Blob
  36. var binStr = win.atob(parts[3]), buf = new win.ArrayBuffer(binStr.length), binary = new win.Uint8Array(buf);
  37. for (var i = 0; i < binary.length; ++i) {
  38. binary[i] = binStr.charCodeAt(i);
  39. }
  40. var blob = new win.Blob([binary], { 'type': parts[1] });
  41. return domurl.createObjectURL(blob);
  42. }
  43. };
  44. /**
  45. * Download a data URL in the browser. Can also take a blob as first param.
  46. *
  47. * @private
  48. * @function Highcharts.downloadURL
  49. * @param {string|global.URL} dataURL
  50. * The dataURL/Blob to download
  51. * @param {string} filename
  52. * The name of the resulting file (w/extension)
  53. * @return {void}
  54. */
  55. var downloadURL = Highcharts.downloadURL = function (dataURL, filename) {
  56. var nav = win.navigator;
  57. var a = doc.createElement('a'), windowRef;
  58. // IE specific blob implementation
  59. // Don't use for normal dataURLs
  60. if (typeof dataURL !== 'string' &&
  61. !(dataURL instanceof String) &&
  62. nav.msSaveOrOpenBlob) {
  63. nav.msSaveOrOpenBlob(dataURL, filename);
  64. return;
  65. }
  66. dataURL = "" + dataURL;
  67. // Some browsers have limitations for data URL lengths. Try to convert to
  68. // Blob or fall back. Edge always needs that blob.
  69. var isEdgeBrowser = /Edge\/\d+/.test(nav.userAgent);
  70. if (isEdgeBrowser || dataURL.length > 2000000) {
  71. dataURL = dataURLtoBlob(dataURL) || '';
  72. if (!dataURL) {
  73. throw new Error('Failed to convert to blob');
  74. }
  75. }
  76. // Try HTML5 download attr if supported
  77. if (typeof a.download !== 'undefined') {
  78. a.href = dataURL;
  79. a.download = filename; // HTML5 download attribute
  80. doc.body.appendChild(a);
  81. a.click();
  82. doc.body.removeChild(a);
  83. }
  84. else {
  85. // No download attr, just opening data URI
  86. try {
  87. windowRef = win.open(dataURL, 'chart');
  88. if (typeof windowRef === 'undefined' || windowRef === null) {
  89. throw new Error('Failed to open window');
  90. }
  91. }
  92. catch (e) {
  93. // window.open failed, trying location.href
  94. win.location.href = dataURL;
  95. }
  96. }
  97. };
  98. var exports = {
  99. dataURLtoBlob: dataURLtoBlob,
  100. downloadURL: downloadURL
  101. };
  102. export default exports;