apis.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. // eslint-disable
  2. import { awaitWrap } from './tools';
  3. /**
  4. * 从本地相册选择图片或使用相机拍照
  5. * @param {object} config 参数详情 => https://uniapp.dcloud.net.cn/api/media/image.html#chooseimage
  6. * @returns
  7. */
  8. export const chooseImage = (config) => {
  9. return awaitWrap(
  10. new Promise((r, j) => {
  11. uni.chooseImage({
  12. ...config,
  13. success: (res) => {
  14. const tmpFiles = res?.tempFiles.map((e) => ({
  15. tempFilePath: e.path,
  16. tempFile: e,
  17. size: e.size,
  18. name: e.name,
  19. type: e.type,
  20. fileType: 'image',
  21. }));
  22. return r({ type: 'image', ...res, tempFiles: tmpFiles });
  23. },
  24. fail: (err) => j({ mode: 'chooseImage', data: err }),
  25. });
  26. })
  27. );
  28. };
  29. /**
  30. * 拍摄视频或从手机相册中选视频,返回视频的临时文件路径
  31. * @param {object} config 参数详情 => https://uniapp.dcloud.net.cn/api/media/video.html#choosevideo
  32. * @returns
  33. */
  34. export const chooseVideo = (config) => {
  35. return awaitWrap(
  36. new Promise((r, j) => {
  37. uni.chooseVideo({
  38. ...config,
  39. success: (res) => {
  40. const tmpFiles = [{
  41. ...res,
  42. tempFilePath: res.tempFilePath,
  43. tempFile: res.tempFile ?? {},
  44. size: res.size,
  45. name: res.name,
  46. type: res.tempFile?.type,
  47. fileType: 'video',
  48. }];
  49. return r({ type: 'video', tempFiles: tmpFiles });
  50. },
  51. fail: (err) => j({ mode: 'chooseVideo', data: err }),
  52. });
  53. })
  54. );
  55. };
  56. /**
  57. * 拍摄或从手机相册中选择图片或视频
  58. * @param {object} config 参数详情 => https://uniapp.dcloud.net.cn/api/media/video.html#choosemedia
  59. * @returns
  60. */
  61. export const chooseMedia = (type, config) => {
  62. if (!type) return console.error('chooseMedia type cannot be empty');
  63. if (!uni.chooseMedia && type === 'image') return chooseImage(config);
  64. if (!uni.chooseMedia && type === 'video') return chooseVideo(config);
  65. return awaitWrap(
  66. new Promise((r, j) => {
  67. uni.chooseMedia({
  68. ...config,
  69. mediaType: [type],
  70. success: (res) => r(res),
  71. fail: (err) => j({ mode: 'chooseMedia', data: err }),
  72. });
  73. })
  74. );
  75. };
  76. /**
  77. * 从本地选择文件(h5)
  78. * @param {object} config 参数详情 => https://uniapp.dcloud.net.cn/api/media/file.html#wx-choosemessagefile
  79. * @returns
  80. */
  81. export const chooseFile = (config) => {
  82. return awaitWrap(
  83. new Promise((r, j) => {
  84. uni.chooseFile({
  85. ...config,
  86. success: (res) => {
  87. const tmpFiles = res?.tempFiles.map((e) => {
  88. let tmpType = 'file';
  89. if (e.type.includes('image')) {
  90. tmpType = 'image';
  91. }
  92. if (e.type.includes('video')) {
  93. tmpType = 'video';
  94. }
  95. return {
  96. tempFilePath: e.path,
  97. tempFile: e,
  98. size: e.size,
  99. name: e.name,
  100. type: e.type,
  101. fileType: tmpType,
  102. };
  103. });
  104. return r({ type: 'file', ...res, tempFiles: tmpFiles });
  105. },
  106. fail: (err) => j({ mode: 'chooseFile', data: err }),
  107. });
  108. })
  109. );
  110. };
  111. /**
  112. * 从本地选择文件(微信小程序)
  113. * @param {object} config 参数详情 => https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.chooseMessageFile.html
  114. * @returns
  115. */
  116. export const chooseMessageFile = (config) => {
  117. return awaitWrap(
  118. new Promise((r, j) => {
  119. wx.chooseMessageFile({
  120. ...config,
  121. success: (res) => {
  122. const tmpFiles = res?.tempFiles.map((e) => ({
  123. ...e,
  124. tempFilePath: e.path,
  125. fileType: e.type ?? 'file',
  126. }));
  127. return r({ type: 'file', ...res, tempFiles: tmpFiles });
  128. },
  129. fail: (err) => j({ mode: 'chooseMessageFile', data: err }),
  130. });
  131. })
  132. );
  133. };
  134. /**
  135. * 上传
  136. * @param {object} config 参数详情 => https://uniapp.dcloud.net.cn/api/request/network-file.html#uploadfile
  137. * @param {object} exts 选择的文件的数据
  138. * @returns {object} exts + response
  139. */
  140. export const uploadFile = (config, exts = {}) => {
  141. return new Promise((r, j) => {
  142. uni.uploadFile({
  143. ...config,
  144. success: (res) => r({ ...exts, response: JSON.parse(res.data) }),
  145. fail: (err) => j({ mode: 'uploadFile', data: err }),
  146. });
  147. });
  148. };
  149. export const appUploadFile = (config, exts = {}, onprogress) => {
  150. const { url, header, formData } = config;
  151. return new Promise((r, j) => {
  152. const xhr = new XMLHttpRequest();
  153. xhr.open('POST', url, true);
  154. for (let key in header) {
  155. xhr.setRequestHeader(key, header[key]);
  156. }
  157. if (onprogress) {
  158. xhr.upload.onprogress = onprogress;
  159. }
  160. xhr.onreadystatechange = function() {
  161. if (xhr.readyState === 4) {
  162. if (xhr.status === 200) {
  163. r({ ...exts, response: JSON.parse(xhr.responseText) });
  164. } else {
  165. j({ mode: 'uploadFile', data: { data: xhr.responseText, errMsg: 'uploadFile fail.' } });
  166. }
  167. }
  168. }
  169. xhr.send(formData);
  170. });
  171. };