apis.js 5.1 KB

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