base64.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. function getLocalFilePath(path) {
  2. if (path.indexOf('_www') === 0 || path.indexOf('_doc') === 0 || path.indexOf('_documents') === 0 || path.indexOf('_downloads') === 0) {
  3. return path
  4. }
  5. if (path.indexOf('file://') === 0) {
  6. return path
  7. }
  8. if (path.indexOf('/storage/emulated/0/') === 0) {
  9. return path
  10. }
  11. if (path.indexOf('/') === 0) {
  12. var localFilePath = plus.io.convertAbsoluteFileSystem(path)
  13. if (localFilePath !== path) {
  14. return localFilePath
  15. } else {
  16. path = path.substr(1)
  17. }
  18. }
  19. return '_www/' + path
  20. }
  21. function dataUrlToBase64(str) {
  22. var array = str.split(',')
  23. return array[array.length - 1]
  24. }
  25. var index = 0
  26. function getNewFileId() {
  27. return Date.now() + String(index++)
  28. }
  29. function biggerThan(v1, v2) {
  30. var v1Array = v1.split('.')
  31. var v2Array = v2.split('.')
  32. var update = false
  33. for (var index = 0; index < v2Array.length; index++) {
  34. var diff = v1Array[index] - v2Array[index]
  35. if (diff !== 0) {
  36. update = diff > 0
  37. break
  38. }
  39. }
  40. return update
  41. }
  42. function filesize(size) {
  43. if (!size) return "";
  44. var num = 1024.00; //byte
  45. if (size < num)
  46. return size + "B";
  47. if (size < Math.pow(num, 2))
  48. return (size / num).toFixed(2) + "KB"; //kb
  49. if (size < Math.pow(num, 3))
  50. return (size / Math.pow(num, 2)).toFixed(2) + "MB"; //M
  51. if (size < Math.pow(num, 4))
  52. return (size / Math.pow(num, 3)).toFixed(2) + "G"; //G
  53. return (size / Math.pow(num, 4)).toFixed(2) + "T"; //T
  54. }
  55. function pathToBase64(path) {
  56. return new Promise(function(resolve, reject) {
  57. if (typeof window === 'object' && 'document' in window) {
  58. if (typeof FileReader === 'function') {
  59. var xhr = new XMLHttpRequest()
  60. xhr.open('GET', path, true)
  61. xhr.responseType = 'blob'
  62. xhr.onload = function() {
  63. if (this.status === 200) {
  64. let fileReader = new FileReader()
  65. fileReader.onload = function(e) {
  66. resolve(e.target.result)
  67. }
  68. fileReader.onerror = reject
  69. fileReader.readAsDataURL(this.response)
  70. }
  71. }
  72. xhr.onerror = reject
  73. xhr.send()
  74. return
  75. }
  76. var canvas = document.createElement('canvas')
  77. var c2x = canvas.getContext('2d')
  78. var img = new Image
  79. img.onload = function() {
  80. canvas.width = img.width
  81. canvas.height = img.height
  82. c2x.drawImage(img, 0, 0)
  83. resolve(canvas.toDataURL())
  84. canvas.height = canvas.width = 0
  85. }
  86. img.onerror = reject
  87. img.src = path
  88. return
  89. }
  90. if (typeof plus === 'object') {
  91. plus.io.resolveLocalFileSystemURL(getLocalFilePath(path), function(entry) {
  92. entry.file(function(file) {
  93. var fileReader = new plus.io.FileReader()
  94. fileReader.onload = function(data) {
  95. resolve(data.target.result)
  96. }
  97. fileReader.onerror = function(error) {
  98. reject(error)
  99. }
  100. fileReader.readAsDataURL(file)
  101. }, function(error) {
  102. reject(error)
  103. })
  104. }, function(error) {
  105. reject(error)
  106. })
  107. return
  108. }
  109. if (typeof wx === 'object' && wx.canIUse('getFileSystemManager')) {
  110. wx.getFileSystemManager().readFile({
  111. filePath: path,
  112. encoding: 'base64',
  113. success: function(res) {
  114. resolve('data:image/png;base64,' + res.data)
  115. },
  116. fail: function(error) {
  117. reject(error)
  118. }
  119. })
  120. return
  121. }
  122. reject(new Error('not support'))
  123. })
  124. }
  125. function base64ToPath(base64) {
  126. return new Promise(function(resolve, reject) {
  127. if (typeof window === 'object' && 'document' in window) {
  128. base64 = base64.split(',')
  129. var type = base64[0].match(/:(.*?);/)[1]
  130. var str = atob(base64[1])
  131. var n = str.length
  132. var array = new Uint8Array(n)
  133. while (n--) {
  134. array[n] = str.charCodeAt(n)
  135. }
  136. return resolve((window.URL || window.webkitURL).createObjectURL(new Blob([array], { type: type })))
  137. }
  138. var extName = base64.split(',')[0].match(/data\:\S+\/(\S+);/)
  139. if (extName) {
  140. extName = extName[1]
  141. } else {
  142. reject(new Error('base64 error'))
  143. }
  144. var fileName = getNewFileId() + '.' + extName
  145. if (typeof plus === 'object') {
  146. var basePath = '_doc'
  147. var dirPath = 'uniapp_temp'
  148. var filePath = basePath + '/' + dirPath + '/' + fileName
  149. if (!biggerThan(plus.os.name === 'Android' ? '1.9.9.80627' : '1.9.9.80472', plus.runtime.innerVersion)) {
  150. plus.io.resolveLocalFileSystemURL(basePath, function(entry) {
  151. entry.getDirectory(dirPath, {
  152. create: true,
  153. exclusive: false,
  154. }, function(entry) {
  155. entry.getFile(fileName, {
  156. create: true,
  157. exclusive: false,
  158. }, function(entry) {
  159. entry.createWriter(function(writer) {
  160. writer.onwrite = function() {
  161. resolve(filePath)
  162. }
  163. writer.onerror = reject
  164. writer.seek(0)
  165. writer.writeAsBinary(dataUrlToBase64(base64))
  166. }, reject)
  167. }, reject)
  168. }, reject)
  169. }, reject)
  170. return
  171. }
  172. var bitmap = new plus.nativeObj.Bitmap(fileName)
  173. bitmap.loadBase64Data(base64, function() {
  174. bitmap.save(filePath, {}, function() {
  175. bitmap.clear()
  176. resolve(filePath)
  177. }, function(error) {
  178. bitmap.clear()
  179. reject(error)
  180. })
  181. }, function(error) {
  182. bitmap.clear()
  183. reject(error)
  184. })
  185. return
  186. }
  187. if (typeof wx === 'object' && wx.canIUse('getFileSystemManager')) {
  188. var filePath = wx.env.USER_DATA_PATH + '/' + fileName
  189. wx.getFileSystemManager().writeFile({
  190. filePath: filePath,
  191. data: dataUrlToBase64(base64),
  192. encoding: 'base64',
  193. success: function() {
  194. resolve(filePath)
  195. },
  196. fail: function(error) {
  197. reject(error)
  198. }
  199. })
  200. return
  201. }
  202. reject(new Error('not support'))
  203. })
  204. }
  205. export default {
  206. filesize,
  207. pathToBase64,
  208. base64ToPath
  209. }