utils.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. const qiniuUploader = require("./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. // 服务器URL上传
  195. export const urlUpload = function(requestInfo, dataFactory) {
  196. return new Promise((resolve, reject) => {
  197. // 本地文件上传去掉默认Content-Type
  198. if (requestInfo.header['Content-Type']) {
  199. delete requestInfo.header['Content-Type'];
  200. }
  201. // 本地文件上传去掉默认Content-Type
  202. if (requestInfo.header['content-type']) {
  203. delete requestInfo.header['content-type'];
  204. }
  205. if (Array.isArray(requestInfo.files)) {
  206. // // #ifdef APP-PLUS || H5
  207. // let files = [];
  208. // let fileData = {
  209. // files: requestInfo.files,
  210. // name: requestInfo.name || "file"
  211. // };
  212. // requestInfo.files.forEach(item => {
  213. // let fileInfo = {
  214. // name: requestInfo.name || "file",
  215. // };
  216. // if(item.path){
  217. // fileInfo.uri = item.path;
  218. // } else {
  219. // fileInfo.file = item;
  220. // }
  221. // files.push(fileInfo);
  222. // });
  223. // let config = {
  224. // url: requestInfo.url,
  225. // files: files,
  226. // header: requestInfo.header, //加入请求头
  227. // success: (response) => {
  228. // //是否用外部的数据处理方法
  229. // if (requestInfo.isFactory && dataFactory) {
  230. // //数据处理
  231. // dataFactory({
  232. // ...requestInfo,
  233. // response: response,
  234. // }).then(data => {
  235. // requestInfo.onEachUpdate && requestInfo.onEachUpdate({
  236. // data: data,
  237. // ...fileData
  238. // });
  239. // resolve(data);
  240. // },err => {
  241. // reject(err);
  242. // });
  243. // } else {
  244. // requestInfo.onEachUpdate && requestInfo.onEachUpdate({
  245. // data: response,
  246. // ...fileData
  247. // });
  248. // resolve(response);
  249. // }
  250. // },
  251. // fail: (err) => {
  252. // reject(err);
  253. // }
  254. // };
  255. // if (requestInfo.data) {
  256. // config.formData = requestInfo.data;
  257. // }
  258. // const uploadTask = uni.uploadFile(config);
  259. // uploadTask.onProgressUpdate(res => {
  260. // requestInfo.onProgressUpdate && requestInfo.onProgressUpdate(Object.assign({}, fileData, res));
  261. // });
  262. // // #endif
  263. // #-ifdef MP
  264. const len = requestInfo.files.length - 1;
  265. let fileList = new Array;
  266. fileUpload(0);
  267. function fileUpload(i) {
  268. let item = requestInfo.files[i];
  269. let fileData = {
  270. fileIndex: i,
  271. files: requestInfo.files,
  272. ...item
  273. };
  274. let config = {
  275. url: requestInfo.url,
  276. filePath: item.path,
  277. header: requestInfo.header, //加入请求头
  278. name: requestInfo.name || "file",
  279. success: (response) => {
  280. //是否用外部的数据处理方法
  281. if (requestInfo.isFactory && dataFactory) {
  282. //数据处理
  283. dataFactory({
  284. ...requestInfo,
  285. response: response,
  286. }).then(data => {
  287. fileList.push(data);
  288. requestInfo.onEachUpdate && requestInfo.onEachUpdate({
  289. data: data,
  290. ...fileData
  291. });
  292. if (len <= i) {
  293. resolve(fileList);
  294. } else {
  295. fileUpload(i + 1);
  296. }
  297. },err => {
  298. reject(err);
  299. });
  300. } else {
  301. requestInfo.onEachUpdate && requestInfo.onEachUpdate({
  302. data: response,
  303. ...fileData
  304. });
  305. fileList.push(response);
  306. if (len <= i) {
  307. resolve(fileList);
  308. } else {
  309. fileUpload(i + 1);
  310. }
  311. }
  312. },
  313. fail: (err) => {
  314. reject(err);
  315. }
  316. };
  317. if (requestInfo.data) {
  318. config.formData = requestInfo.data;
  319. }
  320. const uploadTask = uni.uploadFile(config);
  321. uploadTask.onProgressUpdate(res => {
  322. requestInfo.onProgressUpdate && requestInfo.onProgressUpdate(Object.assign({}, fileData, res));
  323. });
  324. }
  325. // #-endif
  326. } else {
  327. reject({
  328. errMsg: "files 必须是数组类型",
  329. statusCode: 0
  330. });
  331. }
  332. });
  333. }