download-url.js 2.8 KB

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