file_saver.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. /**
  2. * DevExtreme (exporter/file_saver.js)
  3. * Version: 19.1.16
  4. * Build date: Tue Oct 18 2022
  5. *
  6. * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
  7. * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
  8. */
  9. "use strict";
  10. var _renderer = require("../core/renderer");
  11. var _renderer2 = _interopRequireDefault(_renderer);
  12. var _dom_adapter = require("../core/dom_adapter");
  13. var _dom_adapter2 = _interopRequireDefault(_dom_adapter);
  14. var _window = require("../core/utils/window");
  15. var _window2 = _interopRequireDefault(_window);
  16. var _events_engine = require("../events/core/events_engine");
  17. var _events_engine2 = _interopRequireDefault(_events_engine);
  18. var _ui = require("../ui/widget/ui.errors");
  19. var _ui2 = _interopRequireDefault(_ui);
  20. var _type = require("../core/utils/type");
  21. var _type2 = _interopRequireDefault(_type);
  22. var _console = require("../core/utils/console");
  23. function _interopRequireDefault(obj) {
  24. return obj && obj.__esModule ? obj : {
  25. "default": obj
  26. }
  27. }
  28. var window = _window2.default.getWindow();
  29. var navigator = _window2.default.getNavigator();
  30. var FILE_EXTESIONS = {
  31. EXCEL: "xlsx",
  32. CSS: "css",
  33. PNG: "png",
  34. JPEG: "jpeg",
  35. GIF: "gif",
  36. SVG: "svg",
  37. PDF: "pdf"
  38. };
  39. var MIME_TYPES = exports.MIME_TYPES = {
  40. CSS: "text/css",
  41. EXCEL: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
  42. PNG: "image/png",
  43. JPEG: "image/jpeg",
  44. GIF: "image/gif",
  45. SVG: "image/svg+xml",
  46. PDF: "application/pdf"
  47. };
  48. exports.fileSaver = {
  49. _revokeObjectURLTimeout: 3e4,
  50. _getDataUri: function(format, data) {
  51. return "data:" + MIME_TYPES[format] + ";base64," + data
  52. },
  53. _linkDownloader: function(fileName, href) {
  54. var exportLinkElement = _dom_adapter2.default.createElement("a");
  55. exportLinkElement.download = fileName;
  56. exportLinkElement.href = href;
  57. exportLinkElement.target = "_blank";
  58. return exportLinkElement
  59. },
  60. _formDownloader: function(proxyUrl, fileName, contentType, data) {
  61. var formAttributes = {
  62. method: "post",
  63. action: proxyUrl,
  64. enctype: "multipart/form-data"
  65. };
  66. var exportForm = (0, _renderer2.default)("<form>").css({
  67. display: "none"
  68. }).attr(formAttributes);
  69. exportForm.append('<input type="hidden" name="fileName" value="' + fileName + '" />');
  70. exportForm.append('<input type="hidden" name="contentType" value="' + contentType + '" />');
  71. exportForm.append('<input type="hidden" name="data" value="' + data + '" />');
  72. exportForm.appendTo("body");
  73. _events_engine2.default.trigger(exportForm, "submit");
  74. if (_events_engine2.default.trigger(exportForm, "submit")) {
  75. exportForm.remove()
  76. }
  77. },
  78. _saveByProxy: function(proxyUrl, fileName, format, data) {
  79. return this._formDownloader(proxyUrl, fileName, MIME_TYPES[format], data)
  80. },
  81. _winJSBlobSave: function(blob, fileName, format) {
  82. var savePicker = new Windows.Storage.Pickers.FileSavePicker;
  83. savePicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.documentsLibrary;
  84. savePicker.fileTypeChoices.insert(MIME_TYPES[format], ["." + FILE_EXTESIONS[format]]);
  85. savePicker.suggestedFileName = fileName;
  86. savePicker.pickSaveFileAsync().then(function(file) {
  87. if (file) {
  88. file.openAsync(Windows.Storage.FileAccessMode.readWrite).then(function(outputStream) {
  89. var inputStream = blob.msDetachStream();
  90. Windows.Storage.Streams.RandomAccessStream.copyAsync(inputStream, outputStream).then(function() {
  91. outputStream.flushAsync().done(function() {
  92. inputStream.close();
  93. outputStream.close()
  94. })
  95. })
  96. })
  97. }
  98. })
  99. },
  100. _click: function(link) {
  101. try {
  102. link.dispatchEvent(new MouseEvent("click", {
  103. cancelable: true
  104. }))
  105. } catch (e) {
  106. var event = _dom_adapter2.default.getDocument().createEvent("MouseEvents");
  107. event.initMouseEvent("click", true, true, window, 0, 0, 0, 80, 20, false, false, false, false, 0, null);
  108. link.dispatchEvent(event)
  109. }
  110. },
  111. _saveBlobAs: function(fileName, format, data) {
  112. var _this = this;
  113. this._blobSaved = false;
  114. if (_type2.default.isDefined(navigator.msSaveOrOpenBlob)) {
  115. navigator.msSaveOrOpenBlob(data, fileName);
  116. this._blobSaved = true
  117. } else {
  118. if (_type2.default.isDefined(window.WinJS)) {
  119. this._winJSBlobSave(data, fileName, format);
  120. this._blobSaved = true
  121. } else {
  122. var URL = window.URL || window.webkitURL || window.mozURL || window.msURL || window.oURL;
  123. if (_type2.default.isDefined(URL)) {
  124. var objectURL = URL.createObjectURL(data);
  125. var downloadLink = this._linkDownloader(fileName, objectURL);
  126. setTimeout(function() {
  127. URL.revokeObjectURL(objectURL);
  128. _this._objectUrlRevoked = true
  129. }, this._revokeObjectURLTimeout);
  130. this._click(downloadLink)
  131. } else {
  132. _console.logger.warn("window.URL || window.webkitURL || window.mozURL || window.msURL || window.oURL is not defined")
  133. }
  134. }
  135. }
  136. },
  137. saveAs: function(fileName, format, data, proxyURL, forceProxy) {
  138. fileName += "." + FILE_EXTESIONS[format];
  139. if (forceProxy) {
  140. this._saveByProxy(proxyURL, fileName, format, data)
  141. } else {
  142. if (_type2.default.isFunction(window.Blob)) {
  143. this._saveBlobAs(fileName, format, data)
  144. } else {
  145. if (_type2.default.isDefined(proxyURL) && !_type2.default.isDefined(navigator.userAgent.match(/iPad/i))) {
  146. this._saveByProxy(proxyURL, fileName, format, data)
  147. } else {
  148. if (!_type2.default.isDefined(navigator.userAgent.match(/iPad/i))) {
  149. _ui2.default.log("E1034")
  150. }
  151. var downloadLink = this._linkDownloader(fileName, this._getDataUri(format, data));
  152. this._click(downloadLink)
  153. }
  154. }
  155. }
  156. }
  157. };