tools.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. // eslint-disable
  2. export const isObject = (obj) => {
  3. return obj
  4. ? Object.prototype.toString.call(obj) === "[object Object]"
  5. : false;
  6. };
  7. export const isArray = (arr) => {
  8. return arr ? Array.isArray(arr) : false;
  9. };
  10. /**
  11. * handle async await
  12. * @param {*} promise promise
  13. */
  14. export const awaitWrap = (promise) =>
  15. promise.then((res) => [null, res]).catch((err) => [err, {}]);
  16. /**
  17. * 深拷贝
  18. * @param {*} source
  19. */
  20. export const deepClone = (source) => {
  21. if (!isObject(source) && !isArray(source)) return source;
  22. const targetObj = isArray(source) ? [] : {}; // 判断复制的目标是数组还是对象
  23. for (let keys in source) {
  24. // 遍历目标
  25. if (source.hasOwnProperty(keys)) {
  26. if (source[keys] && typeof source[keys] === "object") {
  27. // 如果值是对象,就递归一下
  28. targetObj[keys] = isArray(source[keys]) ? [] : {};
  29. targetObj[keys] = deepClone(source[keys]);
  30. } else {
  31. // 如果不是,就直接赋值
  32. targetObj[keys] = source[keys];
  33. }
  34. }
  35. }
  36. return targetObj;
  37. };
  38. /**
  39. * @description JS对象深度合并
  40. * @param {object} target 需要拷贝的对象
  41. * @param {object} source 拷贝的来源对象
  42. * @returns {object|boolean} 深度合并后的对象或者false(入参有不是对象)
  43. */
  44. export const deepMerge = (target = {}, source = {}) => {
  45. target = deepClone(target);
  46. if (typeof target !== "object" || typeof source !== "object") return false;
  47. for (const prop in source) {
  48. if (!source.hasOwnProperty(prop)) continue;
  49. if (prop in target) {
  50. if (typeof target[prop] !== "object") {
  51. target[prop] = source[prop];
  52. } else if (typeof source[prop] !== "object") {
  53. target[prop] = source[prop];
  54. } else if (target[prop].concat && source[prop].concat) {
  55. target[prop] = target[prop].concat(source[prop]);
  56. } else {
  57. target[prop] = deepMerge(target[prop], source[prop]);
  58. }
  59. } else {
  60. target[prop] = source[prop];
  61. }
  62. }
  63. return target;
  64. };
  65. /**
  66. * 将File对象转为 Blob Url
  67. * @param {File} File对象
  68. * @returns Blob Url
  69. */
  70. export const fileToBlob = (file) => {
  71. if (!file) return;
  72. const fileType = file.type;
  73. const blob = new Blob([file], { type: fileType || 'application/*' });
  74. const blobUrl = window.URL.createObjectURL(blob);
  75. return blobUrl;
  76. };
  77. /**
  78. * 将File对象转为 base64
  79. * @param {File} File对象
  80. * @returns base64
  81. */
  82. export const fileToBase64 = (file) => {
  83. if (!file) return;
  84. return new Promise((r, j) => {
  85. const reader = new FileReader();
  86. reader.onloadend = () => {
  87. const base64String = reader.result;
  88. r(base64String);
  89. };
  90. reader.onerror = () => {
  91. j({ mode: 'fileToBase64', data: { errMsg: 'File to base64 fail.' } });
  92. };
  93. reader.readAsDataURL(file);
  94. });
  95. };
  96. /**
  97. * base64转临时路径(改自https://github.com/zhetengbiji/image-tools/blob/master/index.js)
  98. * @param base64
  99. * @returns
  100. */
  101. function dataUrlToBase64(str) {
  102. var array = str.split(',');
  103. return array[array.length - 1];
  104. };
  105. function biggerThan(v1, v2) {
  106. var v1Array = v1.split('.');
  107. var v2Array = v2.split('.');
  108. var update = false;
  109. for (var index = 0; index < v2Array.length; index++) {
  110. var diff = v1Array[index] - v2Array[index];
  111. if (diff !== 0) {
  112. update = diff > 0;
  113. break;
  114. }
  115. }
  116. return update;
  117. };
  118. var index = 0;
  119. function getNewFileId() {
  120. return Date.now() + String(index++);
  121. };
  122. export const base64ToPath = (base64, name = '') => {
  123. return new Promise((r, j) => {
  124. if (typeof plus !== 'object') {
  125. return j(new Error('not support'));
  126. }
  127. var fileName = '';
  128. if (name) {
  129. const names = name.split('.');
  130. const extName = names.splice(-1);
  131. fileName = `${names.join('.')}-${getNewFileId()}.${extName}`;
  132. } else {
  133. const names = base64.split(',')[0].match(/data\:\S+\/(\S+);/);
  134. if (!names) {
  135. j(new Error('base64 error'));
  136. }
  137. const extName = names[1];
  138. fileName = `${getNewFileId()}.${extName}`;
  139. }
  140. var basePath = '_doc';
  141. var dirPath = 'uniapp_temp';
  142. var filePath = `${basePath}/${dirPath}/${fileName}`;
  143. if (!biggerThan(plus.os.name === 'Android' ? '1.9.9.80627' : '1.9.9.80472', plus.runtime.innerVersion)) {
  144. plus.io.resolveLocalFileSystemURL(basePath, function (entry) {
  145. entry.getDirectory(dirPath, {
  146. create: true,
  147. exclusive: false,
  148. }, function (entry) {
  149. entry.getFile(fileName, {
  150. create: true,
  151. exclusive: false,
  152. }, function (entry) {
  153. entry.createWriter(function (writer) {
  154. writer.onwrite = function () {
  155. r(filePath);
  156. }
  157. writer.onerror = j;
  158. writer.seek(0);
  159. writer.writeAsBinary(dataUrlToBase64(base64));
  160. }, j)
  161. }, j)
  162. }, j)
  163. }, j)
  164. return;
  165. }
  166. var bitmap = new plus.nativeObj.Bitmap(fileName);
  167. bitmap.loadBase64Data(base64, function () {
  168. bitmap.save(filePath, {}, function () {
  169. bitmap.clear();
  170. r(filePath);
  171. }, function (error) {
  172. bitmap.clear();
  173. j(error);
  174. });
  175. }, function (error) {
  176. bitmap.clear();
  177. j(error);
  178. });
  179. });
  180. };