almost-utils.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. /**
  2. * 存储 localStorage 数据
  3. * @param {String} name - 缓存数据的标识
  4. * @param {any} content - 缓存的数据内容
  5. */
  6. export const setStore = (name, content) => {
  7. if (!name) return
  8. if (typeof content !== 'string') {
  9. content = JSON.stringify(content)
  10. }
  11. uni.setStorageSync(name, content)
  12. }
  13. /**
  14. * 获取 localStorage 数据
  15. * @param {String} name - 缓存数据的标识
  16. */
  17. export const getStore = (name) => {
  18. if (!name) return
  19. return uni.getStorageSync(name)
  20. }
  21. /**
  22. * 清除 localStorage 数据
  23. * @param {String} name - 缓存数据的标识
  24. */
  25. export const clearStore = (name) => {
  26. if (name) {
  27. uni.removeStorageSync(name)
  28. } else {
  29. console.log('清理本地全部缓存')
  30. uni.clearStorageSync()
  31. }
  32. }
  33. /**
  34. * 计算文本的长度
  35. * @param {String} text - 文本内容
  36. */
  37. export const clacTextLen = (text) => {
  38. if (!text) return { byteLen: 0, realLen: 0 }
  39. text += ''
  40. let clacLen = 0
  41. for (let i = 0; i < text.length; i++) {
  42. if ((text.charCodeAt(i) < 0) || (text.charCodeAt(i) > 255)) {
  43. clacLen += 2
  44. } else {
  45. clacLen += 1
  46. }
  47. }
  48. // console.log(`当前文本 ${text} 的长度为 ${clacLen / 2}`)
  49. return {
  50. byteLen: clacLen,
  51. realLen: clacLen / 2
  52. }
  53. }
  54. /**
  55. * 下载文件,并返回临时路径
  56. * @return {String} 临时路径
  57. * @param {String} fileUrl - 网络地址
  58. */
  59. export const downloadFile = (fileUrl) => {
  60. return new Promise((resolve) => {
  61. uni.downloadFile({
  62. url: fileUrl,
  63. success: (res) => {
  64. // #ifdef MP-ALIPAY
  65. if (res.errMsg === 'downloadFile:ok') {
  66. resolve({
  67. ok: true,
  68. data: res.errMsg,
  69. tempFilePath: res.tempFilePath
  70. })
  71. } else {
  72. resolve({
  73. ok: false,
  74. data: res.errMsg,
  75. msg: '图片下载失败'
  76. })
  77. }
  78. // #endif
  79. // #ifndef MP-ALIPAY
  80. if (res.statusCode === 200) {
  81. resolve({
  82. ok: true,
  83. data: res.errMsg,
  84. tempFilePath: res.tempFilePath
  85. })
  86. } else {
  87. resolve({
  88. ok: false,
  89. data: res.errMsg,
  90. msg: '图片下载失败'
  91. })
  92. }
  93. // #endif
  94. },
  95. fail: (err) => {
  96. resolve({
  97. ok: false,
  98. data: err.errMsg,
  99. msg: '图片下载失败'
  100. })
  101. }
  102. })
  103. })
  104. }
  105. /**
  106. * 清理应用已缓存的文件
  107. */
  108. export const clearCacheFile = () => {
  109. // #ifndef H5
  110. uni.getSavedFileList({
  111. success: (res) => {
  112. let fileList = res.fileList
  113. if (fileList.length) {
  114. for (let i = 0; i < fileList.length; i++) {
  115. uni.removeSavedFile({
  116. filePath: fileList[i].filePath,
  117. complete: () => {
  118. console.log('清除缓存已完成')
  119. }
  120. })
  121. }
  122. }
  123. },
  124. fail: (err) => {
  125. console.log('getSavedFileList Fail')
  126. }
  127. })
  128. // #endif
  129. // #ifdef H5
  130. clearStore()
  131. // #endif
  132. }
  133. // 图像转换工具,可用于图像和base64的转换
  134. // https://ext.dcloud.net.cn/plugin?id=123
  135. const getLocalFilePath = (path) => {
  136. if (
  137. path.indexOf('_www') === 0 ||
  138. path.indexOf('_doc') === 0 ||
  139. path.indexOf('_documents') === 0 ||
  140. path.indexOf('_downloads') === 0
  141. ) return path
  142. if (path.indexOf('/storage/emulated/0/') === 0) return path
  143. if (path.indexOf('/storage/sdcard0/') === 0) return path
  144. if (path.indexOf('/var/mobile/') === 0) return path
  145. if (path.indexOf('file://') === 0) return path
  146. if (path.indexOf('/') === 0) {
  147. // ios 无法获取本地路径
  148. let localFilePath = plus.os.name === 'iOS' ? path : plus.io.convertLocalFileSystemURL(path)
  149. if (localFilePath !== path) {
  150. return localFilePath
  151. } else {
  152. path = path.substring(1)
  153. }
  154. }
  155. return '_www/' + path
  156. }
  157. export const pathToBase64 = (path) => {
  158. return new Promise((resolve, reject) => {
  159. if (typeof window === 'object' && 'document' in window) {
  160. if (typeof FileReader === 'function') {
  161. let xhr = new XMLHttpRequest()
  162. xhr.open('GET', path, true)
  163. xhr.responseType = 'blob'
  164. xhr.onload = function() {
  165. if (this.status === 200) {
  166. let fileReader = new FileReader()
  167. fileReader.onload = function(e) {
  168. resolve(e.target.result)
  169. }
  170. fileReader.onerror = reject
  171. fileReader.readAsDataURL(this.response)
  172. }
  173. }
  174. xhr.onerror = reject
  175. xhr.send()
  176. return
  177. }
  178. let canvas = document.createElement('canvas')
  179. let c2x = canvas.getContext('2d')
  180. let img = new Image
  181. img.onload = function() {
  182. canvas.width = img.width
  183. canvas.height = img.height
  184. c2x.drawImage(img, 0, 0)
  185. resolve(canvas.toDataURL())
  186. canvas.height = canvas.width = 0
  187. }
  188. img.onerror = reject
  189. img.src = path
  190. return
  191. }
  192. if (typeof plus === 'object') {
  193. let tempPath = getLocalFilePath(path)
  194. plus.io.resolveLocalFileSystemURL(tempPath, (entry) => {
  195. entry.file((file) => {
  196. let fileReader = new plus.io.FileReader()
  197. fileReader.onload = function(data) {
  198. resolve(data.target.result)
  199. }
  200. fileReader.onerror = function(error) {
  201. console.log(error)
  202. reject(error)
  203. }
  204. fileReader.readAsDataURL(file)
  205. }, (error) => {
  206. reject(error)
  207. })
  208. }, (error) => {
  209. reject(error)
  210. })
  211. return
  212. }
  213. if (typeof wx === 'object' && wx.canIUse('getFileSystemManager')) {
  214. wx.getFileSystemManager().readFile({
  215. filePath: path,
  216. encoding: 'base64',
  217. success: (res) => {
  218. resolve('data:image/png;base64,' + res.data)
  219. },
  220. fail: (error) => {
  221. reject(error)
  222. }
  223. })
  224. return
  225. }
  226. reject(new Error('not support'))
  227. })
  228. }
  229. export const base64ToPath = (base64) => {
  230. return new Promise((resolve, reject) => {
  231. if (typeof window === 'object' && 'document' in window) {
  232. base64 = base64.split(',')
  233. let type = base64[0].match(/:(.*?);/)[1]
  234. let str = atob(base64[1])
  235. let n = str.length
  236. let array = new Uint8Array(n)
  237. while (n--) {
  238. array[n] = str.charCodeAt(n)
  239. }
  240. return resolve((window.URL || window.webkitURL).createObjectURL(new Blob([array], {
  241. type: type
  242. })))
  243. }
  244. let extName = base64.match(/data\:\S+\/(\S+);/)
  245. if (extName) {
  246. extName = extName[1]
  247. } else {
  248. reject(new Error('base64 error'))
  249. }
  250. let fileName = Date.now() + '.' + extName
  251. if (typeof plus === 'object') {
  252. let bitmap = new plus.nativeObj.Bitmap('bitmap' + Date.now())
  253. bitmap.loadBase64Data(base64, () => {
  254. let filePath = '_doc/uniapp_temp/' + fileName
  255. bitmap.save(filePath, {}, () => {
  256. bitmap.clear()
  257. resolve(filePath)
  258. }, (error) => {
  259. bitmap.clear()
  260. reject(error)
  261. })
  262. }, (error) => {
  263. bitmap.clear()
  264. reject(error)
  265. })
  266. return
  267. }
  268. if (typeof wx === 'object' && wx.canIUse('getFileSystemManager')) {
  269. let filePath = wx.env.USER_DATA_PATH + '/' + fileName
  270. wx.getFileSystemManager().writeFile({
  271. filePath: filePath,
  272. data: base64.replace(/^data:\S+\/\S+;base64,/, ''),
  273. encoding: 'base64',
  274. success: () => {
  275. resolve(filePath)
  276. },
  277. fail: (error) => {
  278. reject(error)
  279. }
  280. })
  281. return
  282. }
  283. reject(new Error('not support'))
  284. })
  285. }