utils.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. import test from '../../libs/function/test'
  2. function pickExclude(obj, keys) {
  3. // 某些情况下,type可能会为
  4. if (!['[object Object]', '[object File]'].includes(Object.prototype.toString.call(obj))) {
  5. return {}
  6. }
  7. return Object.keys(obj).reduce((prev, key) => {
  8. if (!keys.includes(key)) {
  9. prev[key] = obj[key]
  10. }
  11. return prev
  12. }, {})
  13. }
  14. function formatImage(res) {
  15. return res.tempFiles.map((item) => ({
  16. ...pickExclude(item, ['path']),
  17. type: 'image',
  18. url: item.path,
  19. thumb: item.path,
  20. size: item.size,
  21. // #ifdef H5
  22. name: item.name,
  23. file: item
  24. // #endif
  25. // #ifndef H5
  26. name: item.path.split('/').pop() + '.png',
  27. // #endif
  28. }))
  29. }
  30. function formatVideo(res) {
  31. // console.log(res)
  32. return [
  33. {
  34. ...pickExclude(res, ['tempFilePath', 'thumbTempFilePath', 'errMsg']),
  35. type: 'video',
  36. url: res.tempFilePath,
  37. thumb: res.thumbTempFilePath,
  38. size: res.size,
  39. width: res.width || 0, // APP 2.1.0+、H5、微信小程序、京东小程序
  40. height: res.height || 0, // APP 2.1.0+、H5、微信小程序、京东小程序
  41. // #ifdef H5
  42. name: res.name,
  43. file: res
  44. // #endif
  45. // #ifndef H5
  46. name: res.tempFilePath.split('/').pop() + '.mp4',
  47. // #endif
  48. }
  49. ]
  50. }
  51. function formatMedia(res) {
  52. return res.tempFiles.map((item) => ({
  53. ...pickExclude(item, ['fileType', 'thumbTempFilePath', 'tempFilePath']),
  54. type: res.type,
  55. url: item.tempFilePath,
  56. thumb: res.type === 'video' ? item.thumbTempFilePath : item.tempFilePath,
  57. size: item.size,
  58. // #ifdef H5
  59. file: item
  60. // #endif
  61. // #ifndef H5
  62. name: item.tempFilePath.split('/').pop() + (res.type === 'video' ? '.mp4': '.png'),
  63. // #endif
  64. }))
  65. }
  66. function formatFile(res) {
  67. return res.tempFiles.map((item) => ({
  68. ...pickExclude(item, ['path']),
  69. url: item.path,
  70. size:item.size,
  71. // #ifdef H5
  72. name: item.name,
  73. type: item.type,
  74. file: item
  75. // #endif
  76. }))
  77. }
  78. export function chooseFile({
  79. accept,
  80. multiple,
  81. capture,
  82. compressed,
  83. maxDuration,
  84. sizeType,
  85. camera,
  86. maxCount,
  87. extension
  88. }) {
  89. try {
  90. capture = test.array(capture) ? capture : capture.split(',');
  91. } catch(e) {
  92. capture = [];
  93. }
  94. return new Promise((resolve, reject) => {
  95. switch (accept) {
  96. case 'image':
  97. uni.chooseImage({
  98. count: multiple ? Math.min(maxCount, 9) : 1,
  99. sourceType: capture,
  100. sizeType,
  101. success: (res) => resolve(formatImage(res)),
  102. fail: reject
  103. })
  104. break
  105. // #ifdef MP-WEIXIN
  106. // 只有微信小程序才支持chooseMedia接口
  107. case 'media':
  108. wx.chooseMedia({
  109. count: multiple ? Math.min(maxCount, 9) : 1,
  110. sourceType: capture,
  111. maxDuration,
  112. sizeType,
  113. camera,
  114. success: (res) => resolve(formatMedia(res)),
  115. fail: reject
  116. })
  117. break
  118. // #endif
  119. case 'video':
  120. uni.chooseVideo({
  121. sourceType: capture,
  122. compressed,
  123. maxDuration,
  124. camera,
  125. success: (res) => resolve(formatVideo(res)),
  126. fail: reject
  127. })
  128. break
  129. // #ifdef MP-WEIXIN || H5
  130. // 只有微信小程序才支持chooseMessageFile接口
  131. case 'file':
  132. // #ifdef MP-WEIXIN
  133. wx.chooseMessageFile({
  134. count: multiple ? maxCount : 1,
  135. type: accept,
  136. success: (res) => resolve(formatFile(res)),
  137. fail: reject
  138. })
  139. // #endif
  140. // #ifdef H5
  141. // 需要hx2.9.9以上才支持uni.chooseFile
  142. let params = {
  143. count: multiple ? maxCount : 1,
  144. type: accept,
  145. success: (res) => resolve(formatFile(res)),
  146. fail: reject
  147. }
  148. if (extension.length && extension.length > 0) {
  149. params.extension = extension
  150. }
  151. uni.chooseFile(params)
  152. // #endif
  153. break
  154. // #endif
  155. default:
  156. // 此为保底选项,在accept不为上面任意一项的时候选取全部文件
  157. // #ifdef MP-WEIXIN
  158. wx.chooseMessageFile({
  159. count: multiple ? maxCount : 1,
  160. type: 'all',
  161. success: (res) => resolve(formatFile(res)),
  162. fail: reject
  163. })
  164. // #endif
  165. // #ifdef H5
  166. // 需要hx2.9.9以上才支持uni.chooseFile
  167. let paramsFile = {
  168. count: multiple ? maxCount : 1,
  169. type: 'all',
  170. success: (res) => resolve(formatFile(res)),
  171. fail: reject
  172. }
  173. if (extension.length && extension.length > 0) {
  174. paramsFile.extension = extension
  175. }
  176. uni.chooseFile(paramsFile)
  177. // #endif
  178. }
  179. })
  180. }