utils.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. import qiniuUploader from "./qiniuUploader"
  2. //七牛云上传文件命名
  3. export const randomChar = function (l, url = "") {
  4. const x = "0123456789qwertyuioplkjhgfdsazxcvbnm";
  5. let tmp = "";
  6. let time = new Date();
  7. for (let i = 0; i < l; i++) {
  8. tmp += x.charAt(Math.ceil(Math.random() * 100000000) % x.length);
  9. }
  10. return (
  11. "file/" +
  12. url +
  13. time.getTime() +
  14. tmp
  15. );
  16. }
  17. //图片选择
  18. export const chooseImage = function (data) {
  19. return new Promise((resolve, reject) => {
  20. uni.chooseImage({
  21. count: data.count || 9, //默认9
  22. sizeType: data.sizeType || ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
  23. sourceType: data.sourceType || ['album', 'camera'], //从相册选择
  24. success: function (res) {
  25. resolve(res.tempFiles);
  26. },
  27. fail: err => {
  28. reject({
  29. errMsg: err.errMsg,
  30. errCode: err.errCode,
  31. statusCode: 0,
  32. });
  33. }
  34. });
  35. });
  36. }
  37. //视频选择
  38. export const chooseVideo = function (data) {
  39. return new Promise((resolve, reject) => {
  40. uni.chooseVideo({
  41. sourceType: data.sourceType || ['album', 'camera'], //从相册选择
  42. compressed: data.compressed || false, //是否压缩所选的视频源文件,默认值为 true,需要压缩。
  43. maxDuration: data.maxDuration || 60, //拍摄视频最长拍摄时间,单位秒。最长支持 60 秒。
  44. camera: data.camera || 'back', //'front'、'back',默认'back'
  45. success: function (res) {
  46. let files = [{
  47. path: res.tempFilePath
  48. }];
  49. // #ifdef APP-PLUS || H5 || MP-WEIXIN
  50. files[0].duration = res.duration;
  51. files[0].size = res.size;
  52. files[0].height = res.height;
  53. files[0].width = res.width;
  54. // #endif
  55. // #ifdef H5
  56. files[0].name = res.name;
  57. // #endif
  58. resolve(files);
  59. },
  60. fail: err => {
  61. reject({
  62. errMsg: err.errMsg,
  63. errCode: err.errCode,
  64. statusCode: 0,
  65. });
  66. }
  67. });
  68. });
  69. }
  70. // 选择文件
  71. export const chooseFile = function (data) {
  72. return new Promise((resolve, reject) => {
  73. // #ifdef MP-WEIXIN
  74. uni.chooseMessageFile({
  75. count: data.count ? data.count : 1,
  76. type: 'file',
  77. extension: data.extension ? data.extension : ['jpg', 'jpeg', 'png', 'mp4', 'avi'],
  78. success: function (res) {
  79. let files = [
  80. // {
  81. // path,
  82. // size,
  83. // name,
  84. // type,
  85. // time,
  86. // }
  87. ];
  88. res.tempFiles.forEach((item, index) => {
  89. files.push(
  90. {
  91. path: item.path,
  92. size: item.size,
  93. name: item.name,
  94. type: item.type,
  95. time: item.time,
  96. }
  97. )
  98. })
  99. resolve(files);
  100. },
  101. fail: err => {
  102. reject({
  103. errMsg: err.errMsg,
  104. errCode: err.errCode,
  105. statusCode: 0,
  106. });
  107. }
  108. })
  109. // #endif
  110. // #ifndef MP-WEIXIN
  111. // #endif
  112. });
  113. }
  114. // 七牛云上传
  115. export const qiniuUpload = function (requestInfo, getQnToken) {
  116. return new Promise((resolve, reject) => {
  117. if (Array.isArray(requestInfo.files)) {
  118. let len = requestInfo.files.length;
  119. let fileList = new Array;
  120. if (getQnToken) {
  121. getQnToken(qnRes => {
  122. /*
  123. *接口返回参数:
  124. *visitPrefix:访问文件的域名
  125. *token:七牛云上传token
  126. *folderPath:上传的文件夹
  127. *region: 地区 默认为:SCN
  128. */
  129. let prefixLen = qnRes.visitPrefix.length;
  130. if (qnRes.visitPrefix.charAt(prefixLen - 1) == '/') {
  131. qnRes.visitPrefix = qnRes.visitPrefix.substring(0, prefixLen - 1)
  132. }
  133. uploadFile(0);
  134. function uploadFile(i) {
  135. let item = requestInfo.files[i];
  136. let updateUrl = randomChar(10, qnRes.folderPath);
  137. let fileData = {
  138. fileIndex: i,
  139. files: requestInfo.files,
  140. ...item
  141. };
  142. if (item.name) {
  143. fileData.name = item.name;
  144. let nameArr = item.name.split(".");
  145. updateUrl += "." + nameArr[nameArr.length - 1];
  146. }
  147. // 交给七牛上传
  148. qiniuUploader.upload(item.path || item, (res) => {
  149. fileData.url = res.imageURL;
  150. requestInfo.onEachUpdate && requestInfo.onEachUpdate({
  151. url: res.imageURL,
  152. ...fileData
  153. });
  154. fileList.push({
  155. name: item.name,
  156. url: res.imageURL,
  157. });
  158. if (len - 1 > i) {
  159. uploadFile(i + 1);
  160. } else {
  161. resolve(fileList);
  162. }
  163. }, (error) => {
  164. reject(error);
  165. }, {
  166. region: qnRes.region || 'SCN', //地区
  167. domain: qnRes.visitPrefix, // bucket 域名,下载资源时用到。
  168. key: updateUrl,
  169. uptoken: qnRes.token, // 由其他程序生成七牛 uptoken
  170. uptokenURL: 'UpTokenURL.com/uptoken' // 上传地址
  171. }, (res) => {
  172. console.log(requestInfo);
  173. requestInfo.onProgressUpdate && requestInfo.onProgressUpdate(Object.assign({}, fileData, res));
  174. // console.log('上传进度', res.progress)
  175. // console.log('已经上传的数据长度', res.totalBytesSent)
  176. // console.log('预期需要上传的数据总长度', res.totalBytesExpectedToSend)
  177. });
  178. }
  179. });
  180. } else {
  181. reject({
  182. errMsg: "请添加七牛云回调方法:getQnToken",
  183. statusCode: 0
  184. });
  185. }
  186. } else {
  187. reject({
  188. errMsg: "files 必须是数组类型",
  189. statusCode: 0
  190. });
  191. }
  192. ;
  193. });
  194. }
  195. // 服务器URL上传
  196. export const urlUpload = function (requestInfo, dataFactory) {
  197. return new Promise((resolve, reject) => {
  198. // 本地文件上传去掉默认Content-Type
  199. if (requestInfo.header['Content-Type']) {
  200. delete requestInfo.header['Content-Type'];
  201. }
  202. // 本地文件上传去掉默认Content-Type
  203. if (requestInfo.header['content-type']) {
  204. delete requestInfo.header['content-type'];
  205. }
  206. if (Array.isArray(requestInfo.files)) {
  207. // // #ifdef APP-PLUS || H5
  208. // let files = [];
  209. // let fileData = {
  210. // files: requestInfo.files,
  211. // name: requestInfo.name || "file"
  212. // };
  213. // requestInfo.files.forEach(item => {
  214. // let fileInfo = {
  215. // name: requestInfo.name || "file",
  216. // };
  217. // if(item.path){
  218. // fileInfo.uri = item.path;
  219. // } else {
  220. // fileInfo.file = item;
  221. // }
  222. // files.push(fileInfo);
  223. // });
  224. // let config = {
  225. // url: requestInfo.url,
  226. // files: files,
  227. // header: requestInfo.header, //加入请求头
  228. // success: (response) => {
  229. // //是否用外部的数据处理方法
  230. // if (requestInfo.isFactory && dataFactory) {
  231. // //数据处理
  232. // dataFactory({
  233. // ...requestInfo,
  234. // response: response,
  235. // }).then(data => {
  236. // requestInfo.onEachUpdate && requestInfo.onEachUpdate({
  237. // data: data,
  238. // ...fileData
  239. // });
  240. // resolve(data);
  241. // },err => {
  242. // reject(err);
  243. // });
  244. // } else {
  245. // requestInfo.onEachUpdate && requestInfo.onEachUpdate({
  246. // data: response,
  247. // ...fileData
  248. // });
  249. // resolve(response);
  250. // }
  251. // },
  252. // fail: (err) => {
  253. // reject(err);
  254. // }
  255. // };
  256. // if (requestInfo.data) {
  257. // config.formData = requestInfo.data;
  258. // }
  259. // const uploadTask = uni.uploadFile(config);
  260. // uploadTask.onProgressUpdate(res => {
  261. // requestInfo.onProgressUpdate && requestInfo.onProgressUpdate(Object.assign({}, fileData, res));
  262. // });
  263. // // #endif
  264. // #-ifdef MP
  265. const len = requestInfo.files.length - 1;
  266. let fileList = new Array;
  267. fileUpload(0);
  268. function fileUpload(i) {
  269. let item = requestInfo.files[i];
  270. let fileData = {
  271. fileIndex: i,
  272. files: requestInfo.files,
  273. ...item
  274. };
  275. let config = {
  276. url: requestInfo.url,
  277. filePath: item.path,
  278. header: requestInfo.header, //加入请求头
  279. name: requestInfo.name || "file",
  280. success: (response) => {
  281. //是否用外部的数据处理方法
  282. if (requestInfo.isFactory && dataFactory) {
  283. //数据处理
  284. dataFactory({
  285. ...requestInfo,
  286. response: response,
  287. }).then(data => {
  288. fileList.push(data);
  289. requestInfo.onEachUpdate && requestInfo.onEachUpdate({
  290. data: data,
  291. ...fileData
  292. });
  293. if (len <= i) {
  294. resolve(fileList);
  295. } else {
  296. fileUpload(i + 1);
  297. }
  298. }, err => {
  299. reject(err);
  300. });
  301. } else {
  302. requestInfo.onEachUpdate && requestInfo.onEachUpdate({
  303. data: response,
  304. ...fileData
  305. });
  306. fileList.push(response);
  307. if (len <= i) {
  308. resolve(fileList);
  309. } else {
  310. fileUpload(i + 1);
  311. }
  312. }
  313. },
  314. fail: (err) => {
  315. reject(err);
  316. }
  317. };
  318. if (requestInfo.data) {
  319. config.formData = requestInfo.data;
  320. }
  321. const uploadTask = uni.uploadFile(config);
  322. uploadTask.onProgressUpdate(res => {
  323. requestInfo.onProgressUpdate && requestInfo.onProgressUpdate(Object.assign({}, fileData, res));
  324. });
  325. }
  326. // #-endif
  327. } else {
  328. reject({
  329. errMsg: "files 必须是数组类型",
  330. statusCode: 0
  331. });
  332. }
  333. });
  334. }